POJ3630 Phone List(字典树)

题目大意:

输入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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章