题目大意:
输入n个电话号码,如果一个电话号码是另一个的前缀输出”NO”否则输出”YES”
题目思路:本题要用到字典树的插入和查询:
#include<cstdio>
#include<cstring>
struct node{//定义结构体
int sum,n[10],e;
node(){
sum=0;
memset(n,0,sizeof(n));
e=0;
}
}a[100010];//定大了超时
int e,p;
char s[10010];
void lily2(char *s){//建造
e=0;
for(int i=0;i<strlen(s);i++)
if(a[e].n[s[i]-'0']==0){
a[e].n[s[i]-'0']=++p;
e=p;
a[e].sum++;
}else{
e=a[e].n[s[i]-'0'];
a[e].sum++;
}
a[e].e=1;
}
int lily(char *s){//查询
int c=1,e=0;
for(int i=0;i<strlen(s);i++){
if(a[e].n[s[i]-'0']==0)c=0;
e=a[e].n[s[i]-'0'];
if(a[e].e)return c;
}
return c;
}
int main(void){
int i,j,k,m,n,t,d=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
d=0;
memset(a,0,sizeof(a));//不清空w掉
p=0;
for(i=1;i<=n;i++){
scanf("%s",s);
if(lily(s)>0)d=1;
lily2(s);
}
if(d==1)printf("NO\n");//输出
else printf("YES\n");
}
return 0;
}