HDU1671 水题字典树
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int T,trie[110010][10],n,cnt;
int f[110010];
char c[12];
bool flag;
void _insert()
{
int L=strlen(c+1),tmp=0;
for(int i=1;i<L;i++){
if(!trie[tmp][c[i]-'0']) trie[tmp][c[i]-'0']=++cnt;
tmp=trie[tmp][c[i]-'0'];
if(f[tmp]) flag=false;
}//最后一位单独判断
if(trie[tmp][c[L]-'0']) flag=false;
else trie[tmp][c[L]-'0']=++cnt;
f[trie[tmp][c[L]-'0']]=1;
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(trie,0,sizeof(trie));
memset(f,0,sizeof(f));//记录是否为单词尾字母
flag=true;cnt=0;
for(int i=1;i<=n;i++){
scanf("%s",c+1);
if(flag) _insert();
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
It is your time to fight!