Trie树判断是否存在某个字符串为另外一个字符串的前缀。和HDOJ1305一样。一开始忘记再work里加初始化。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 10
typedef struct Trie
{
int next[MAXN];
int cnt;
bool tail;
};
Trie f[500000];
int tot;
void TrieInit()
{
int i;
tot=MAXN;
memset(f,0,sizeof(f));
for(i=0;i<MAXN;i++) f[0].next[i]=i+1;
}
bool Insert(char *s)
{
int i,j,k,l,flag;
l=strlen(s);
flag=0;
k=0;
for(i=0;i<l;i++)
{
if(f[k].next[s[i]-'0']!=0)
{
k=f[k].next[s[i]-'0'];
if(f[k].tail) return 1;
if(i==l-1)
{
flag=f[k].cnt;
f[k].tail=1;
}
f[k].cnt++;
}
else
{
tot++;
f[k].next[s[i]-'0']=tot;
k=tot;
if(f[k].tail) return 1;
if(i==l-1)
{
flag=f[k].cnt;
f[k].tail=1;
}
f[k].cnt++;
}
}
return flag;
}
void work()
{
int i,j,k,t,m,n,flag;
char s[15];
TrieInit();
scanf("%d",&n);
getchar();
flag=1;
for(i=0;i<n;i++)
{
gets(s);
if(flag) flag=1-Insert(s);
}
printf(flag?"YES\n":"NO\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--) work();
return 0;
}