|
#include<iostream>
using namespace std;
struct trieNode
{
int next[10];
bool isword;
};
trieNode Root;
int N=1000000;
trieNode tt[1000000];
int len;
bool insert(char * tar)
{
trieNode * p= &tt[0];
int id ;
while(*tar)
{
id=*tar-'0';
if(p->next[id]==-1)
{
p->next[id]=len;
len++;
}
if(p->isword)//有前缀存在
return false;
p=&tt[p->next[id]];
tar++;
}
p->isword=true;
for(int i=0;i<10;++i)
{
//成为其他号码的前缀
if(p->next[i]!=-1)
return false;
}
return true;
}
void clear ( int n)
{
for(int i=0;i<n;++i)
{
tt[i].isword=false;
memset(tt[i].next,-1,sizeof(tt[i].next));
}
}
int main()
{
int c;
int n;
int i,j;
char str[10005][15];
scanf("%d",&c);
clear(N);
for(i=0;i<c;++i)
{
scanf("%d",&n);
clear(len);
len=1;
bool flag=false;
for(j=0;j<n;++j)
{
scanf("%s",&str[i]);
if(flag)
continue;
if(insert(str[i])==false)
{
printf("NO\n");
flag=true;
}
}
if(!flag)
printf("YES\n");
}
return 0;
}
|