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