专栏文章

题解:UVA13257 License Plates

UVA13257题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio7cb9g
此快照首次捕获于
2025/12/02 14:33
3 个月前
此快照最后确认于
2025/12/02 14:33
3 个月前
查看原文
题意
给你 TT 个字符串,每个字符串为 SiS_i,要在 SiS_i 中找长度为 33 的不同字符串( 33 个字符可以不连续)的个数。
暴力思路
依次枚举用 33 个标记变量标记每一位,用 11 个桶,存储每一个出现的字符串,如果之前没有出现,字符串的可能性 +1+1
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;
}
因为字符串长度较大,如果按上述方法,一定会超时。所以考虑开 33 个桶,分别开一维,二维,三维数组各一个。
  • 如果 aia_i 出现过了,表示开头的字符串,已经被标记了,就不需要往下继续考虑了。
  • 如果 bij{b_i}_j 出现过了,表示开头的字符串,已经被标记了,就不需要往下继续考虑了。
  • 如果 cijk{{c_i}_j}_k 出现过了,表示开头的字符串,已经被标记了。
这样可以使不需要浪费的时间收集起来,让代码速度变快。
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 条评论,欢迎与作者交流。

正在加载评论...