http://acm.hdu.edu.cn/showproblem.php?pid=1671
判断是否有字符串是另一个字符串的前缀。
//题意是判断一个号码是否是另一个号码的前缀,主要思想没变,记录每一个节点的出现次数,然后
//枚举每一个单词,看是否最后一个字母出现过两次,是的话即为另一个单词的后缀。
#include<cstdio>
#include<cstring>
#include<malloc.h>
typedef struct node
{
int count;
struct node *next[10];
}*tree;
void insert(tree h,char *s)
{
tree p=h;
int len=strlen(s),i;
for(i=0;i<len;i++)
{
int index=s[i]-'0';
if(p->next[index]!=NULL)
{
p=p->next[index];
p->count++;
}
else
{
tree tem=(tree)calloc(1,sizeof(node));
tem->count=1;
p->next[index]=tem;
p=tem;
}
}
}
int find(tree h,char *s)
{
tree p=h;
int len=strlen(s),i;
for(i=0;i<len;i++)
{
int index=s[i]-'0';
if(p->next[index]!=NULL)
p=p->next[index];
else return 0;
}
return p->count;
}
void delet(tree head)//注意这里,让我错了多次
{
int i;
for(i=0;i<10;i++)
{
if(head->next[i]!=NULL)
delet(head->next[i]);
}
free(head);
}
char s[10001][11];
int main()
{
//freopen("a.txt","r",stdin);
int t,n,i,flag;
scanf("%d",&t);
while(t--)
{
tree head=(tree)calloc(1,sizeof(node));
head->count=0;
flag=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
insert(head,s[i]);
}
for(i=0;i<n;i++)
{
if(find(head,s[i])>1) {flag=1;break;}
}
if(flag)printf("NO\n");
else printf("YES\n");
delet(head);
}
return 0;
}