刷刷更健康...这道题掌握了字典树难度不大...关键是如何判断是否有串是某串的前缀~~...这个我是用个数组记住每个字符串末尾节点的位置~~做的时候是经过一个点就+1...最后只要判断所有的末尾节点是不是都为1~~~如果都为1当然就说明没有谁为谁的前缀字串~~反之就是有串是某串的前缀字串~~
Program:
#include<iostream>
using namespace std;
struct node
{
int s[11],k;
}a[200001];
int t,n,len,judge[10001],g,i;
char s[20];
bool f;
void find(int h,int k)
{
if (k==len) return;
a[h].k+=1;
if (!a[h].s[s[k]-'0'])
{
g++;
if (k==len-1)
{
a[g].k=1;
judge[i]=g;
}
a[h].s[s[k]-'0']=g;
}
find(a[h].s[s[k]-'0'],k+1);
return;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(judge,0,sizeof(judge));
g=0; getchar();
for (i=1;i<=n;i++)
{
gets(s);
len=strlen(s);
find(0,0);
}
f=true;
for (i=1;i<=n;i++)
if (a[judge[i]].k!=1) f=false;
if (f) printf("YES\n"); else printf("NO\n");
}
return 0;
}