http://poj.org/problem?id=3630
简单的trie树问题,先添加,然后每个跑一边看中途有没有被打上结束标记即可。
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
bool ed;
int son[];
void clear(){
memset(son,,sizeof(son));
ed=;
}
}tree[];
char s[][];
int tot;
void insert(int k){
int l=strlen(s[k]);
int now=;
for(int i=;i<l;i++){
if(tree[now].son[s[k][i]-'']==){
tot++;
tree[now].son[s[k][i]-'']=tot;
}
now=tree[now].son[s[k][i]-''];
}
tree[now].ed=;
return;
}
bool check(int k){
int l=strlen(s[k]);
int now=;
for(int i=;i<l;i++){
if(tree[now].son[s[k][i]-'']==){
return ;
}
if(tree[now].ed)return ;
now=tree[now].son[s[k][i]-''];
}
return ;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=;i<=;i++)tree[i].clear();
tot=;
int n;bool ok=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s[i]);
insert(i);
}
for(int i=;i<=n;i++){
if(check(i)){
ok=;
break;
}
}
if(ok==)printf("NO\n");
else printf("YES\n");
}
return ;
}