专栏文章
题解:UVA13257 License Plates
UVA13257题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio7cb9g
- 此快照首次捕获于
- 2025/12/02 14:33 3 个月前
- 此快照最后确认于
- 2025/12/02 14:33 3 个月前
题意
给你 个字符串,每个字符串为 ,要在 中找长度为 的不同字符串( 个字符可以不连续)的个数。
暴力思路
依次枚举用 个标记变量标记每一位,用 个桶,存储每一个出现的字符串,如果之前没有出现,字符串的可能性 。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,c[30][30][30];
string s;
signed main()
{
cin>>t;
while(t--)
{
cin>>s;
int ans=0;
memset(c,0,sizeof c);
for(int i=0;i<s.size();i++)
{
for(int j=i+1;j<s.size();j++)
{
for(int k=j+1;k<s.size();k++)
{
if(c[s[i]-'A'][s[j]-'A'][s[k]-'A']) continue;
c[s[i]-'A'][s[j]-'A'][s[k]-'A']=1;
ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}
因为字符串长度较大,如果按上述方法,一定会超时。所以考虑开 个桶,分别开一维,二维,三维数组各一个。
- 如果 出现过了,表示开头的字符串,已经被标记了,就不需要往下继续考虑了。
- 如果 出现过了,表示开头的字符串,已经被标记了,就不需要往下继续考虑了。
- 如果 出现过了,表示开头的字符串,已经被标记了。
这样可以使不需要浪费的时间收集起来,让代码速度变快。
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,a[30],b[30][30],c[30][30][30];
string s;
signed main()
{
cin>>t;
while(t--)
{
cin>>s;
int ans=0;
memset(a,0,sizeof a);
memset(b,0,sizeof b);
memset(c,0,sizeof c);
for(int i=0;i<s.size();i++)
{
if(a[s[i]-'A']) continue;
a[s[i]-'A']=1;
for(int j=i+1;j<s.size();j++)
{
if(b[s[i]-'A'][s[j]-'A']) continue;
b[s[i]-'A'][s[j]-'A']=1;
for(int k=j+1;k<s.size();k++)
{
if(c[s[i]-'A'][s[j]-'A'][s[k]-'A']) continue;
c[s[i]-'A'][s[j]-'A'][s[k]-'A']=1;
ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...