Phone List
题目描述
给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据。
输入格式
第一行一个整数 ,表示数据组数。
对于每组数据,第一行一个数 ,接下来 行输入 个数字串。
输出格式
对于每组数据,若存在两个数字串 ,,使得 是 的前缀,则输出 NO ,否则输出 YES 。
请注意此处结果与输出的对应关系!
样例
样例输入
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346
样例输出
NO
YES
#include<stdio.h>
#include<string.h>
int tr[100003][30],f[100003]; //tr[]数组储存,f[]数组标记
char s[30];
int t,n,tot;
int insert(){ //插入一个字符串并判断
int a=1,b,i,len=strlen(s),flag=0;
for(i=0;i<len;i++){
b=s[i]-'0';
if(!tr[a][b])//如果从当前位置没有一条通向数字b的路
tr[a][b]=++tot;//创建一个新节点,并把这条边给记录
else if(i==len-1)//如果从当前位置有一条通向数字b的路且当前单词已经结束
flag=1; //说明这个单词是前面所输入单词其中几个的前缀
a=tr[a][b];//令a等于当前节点所指向的节点
if(f[a]) //如果当前节点所指向的节点位置是一个单词的尾部
flag=1;
}
f[a]=1;//把单词尾部标记为真
return flag;
}
int main(){
scanf("%d",&t);
while(t--){
memset(tr,0,sizeof(tr));
memset(f,0,sizeof(f));
int i,ans=0;
tot=1;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s",s);
if(insert())
ans=1;
}
if(ans)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}