题目链接:https://vjudge.net/problem/HDU-1671
题意:给定n个字符串,判断是否存在一些字符串是另一些字符串的前缀。
思路:
套模板,存在前缀可能是两种情况:
当前字符串枚举位数时已经存在之前的字符串了;(即已经存在911,当前插入9112)
或者当前字符串枚举完之后,该结点还有子结点。(即已经存在9112,当前插入911)
AC code:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e6+5;
int T,n,trie[maxn][12],key[maxn],cnt;
int flag;
char str[12];
void insert(char *s){
int len=strlen(s),u=0;
for(int i=0;i<len;++i){
int t=s[i]-'0';
if(!trie[u][t]){
++cnt;
memset(trie[cnt],0,sizeof(trie[cnt]));
key[cnt]=0;
trie[u][t]=cnt;
}
if(key[trie[u][t]]){
flag=0;
return;
}
u=trie[u][t];
if(i==len-1) key[u]=1;
}
for(int i=0;i<10;++i)
if(trie[u][i]){
flag=0;
break;
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(trie[0],0,sizeof(trie[0]));
flag=1,cnt=0;
for(int i=0;i<n;++i){
scanf("%s",str);
if(flag) insert(str);
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}