Phone List
POJ – 3630
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#define maxn 10005
using namespace std;
int tot;//申请空间
int flag;//标记是否出现前缀
int n;
struct node
{
int ch[11];
int f;
void init()
{
memset(ch,0,sizeof(ch));
f=0;
}
}tr[100005];//空间要开大
void Insert(char *p)
{
int now=0;
for(int i=0;p[i];i++)
{
int tem=p[i]-'0';
if(!tr[now].ch[tem])
{
tr[now].ch[tem]=++tot;
tr[tot].init();
}
now=tr[now].ch[tem];
if(tr[now].f)flag=1;//此为短串在长串之前出现。
}
for(int i=1;i<=9;i++)if(tr[now].ch[i])flag=1;//可能短的串在前边,所以说如果该点之后还有点的话就说明该串是某个串的前缀
tr[now].f=1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
tot=0;
flag=0;
tr[0].init();
cin>>n;
char s[15];
for(int i=0;i<n;i++)
{
scanf("%s",s);
Insert(s);
}
if(flag)printf("NO\n");
else puts("YES");
}
}