題目大意:
輸入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;
}