B Prefix Code
传送门
Trie(单词查找树):高效处理字符串;
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+7;
int tree[N][11],cnt;
bool vis[N];
bool add( char *s )
{
int len=strlen(s) , now=0;
bool flag=0;
for( int i=0;i<len;i++ )
{
int x=s[i]-'0';
if( i==len-1 && tree[now][x] ) flag=1;
if( !tree[now][x] ) tree[now][x]=++cnt;
now=tree[now][x];
if( vis[now] ) flag=1;
}
vis[now]=1;
return flag;
}
int main()
{
int T,kk =1;
cin>>T;
while( T-- )
{
cnt=0;
int n,flag=0;
scanf("%d",&n);
memset(tree,0,sizeof tree);
memset(vis,0,sizeof vis);
char s[11];
for( int i=0;i<n;i++ ){
scanf("%s",s);
if(add(s)) flag=1;
}
if(flag) printf("Case #%d: No\n",kk++) ;
else printf("Case #%d: Yes\n",kk++) ;
}
return 0;
}
使用unordered_map<string,int> 对字符串计数:
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
const int N = 1e5+7;
int main()
{
int t;
cin>>t;
for(int k=1;k<=t;k++){
int n;
int flag = 1;
scanf("%d",&n);
unordered_map<string,int> mp;
char s[10010][15];
for(int j=0;j<n;j++){
scanf("%s",s[j]);
int len = strlen(s[j]);
string ss = "";
for(int i=0;i<len;i++){
ss+=s[j][i];
mp[ss]++;
}
}
for(int i=0;i<n;i++){
if(mp[s[i]]>1){
flag=0;break;
}
}
if(flag) printf("Case #%d: Yes\n",k);
else printf("Case #%d: No\n",k);
}
return 0;
}