题目大意:
每个case给出几串数字,判断是否存在一串数字是其他数字的前缀,如果有输出NO,否则YES
分析:
trie树
代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=10+5,maxm=10000+5;
int cas,n,tot=0,flag;
struct trie{
int cnt,nxt[maxn];
}node[maxm*20];
inline void init(void){
for(int i=0;i<=tot;i++){
for(int j=0;j<=9;j++)
node[i].nxt[j]=0;
node[i].cnt=0;
}
flag=tot=0;
}
inline void insert(char *word){
int p=0,len=strlen(word);
for(int i=0;i<len;i++){
int tmp=word[i]-'0';
if(!node[p].nxt[tmp])
node[p].nxt[tmp]=++tot;
p=node[p].nxt[tmp];
}
node[p].cnt++;
}
inline bool search(char *word){
int p=0,len=strlen(word);
for(int i=0;i<len-1;i++){
int tmp=word[i]-'0';
p=node[p].nxt[tmp];
if(node[p].cnt)
return true;
}
return false;
}
signed main(void){
char word[maxm][10+5];
scanf("%d",&cas);
while(cas--){
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",word[i]),insert(word[i]);
for(int i=1;i<=n;i++)
if(search(word[i])){
flag=1;
break;
}
if(!flag)
puts("YES");
else
puts("NO");
}
return 0;
}
by >_< neighthorn