Dial (trie template)

dial

HDU 1671
question meaning: Given n strings, if one of them is a prefix of the other, output NO.

template

int n,m;
int trie[maxn][30],tot=1;
int en[maxn];
char ss[maxn][30];
void inser(char *s){
    
    //trie插入
    int ch,len=strlen(s),p=1;
    for(int i=0;i<len;i++){
    
    
        ch=s[i]-'0';
        if(trie[p][ch]==0)trie[p][ch]=++tot;
        p=trie[p][ch];
    }
    en[p]++;
}
int sear(char *s){
    
    //检索字符串是否存在
    int len=strlen(s),p=1;
    for(int i=0;i<len;i++){
    
    
        p=trie[p][s[i]-'0'];
        if(en[p]>=1&&i!=len-1)return 1;
        if(i==len-1&&en[p]>1)return 1;
    }
    return 0;
}
int main(){
    
    
    int t,sum;
    sci(t);
    while(t--){
    
    
        for(int i=1;i<=tot;i++)mem(trie[i],0);
        tot=1;
        mem(en,0);
        sum=0;
        sci(n);
        rep(i,1,n){
    
    
            scanf("%s",ss[i]);
            inser(ss[i]);
        }
        rep(i,1,n){
    
    
            if(sear(ss[i])){
    
    sum=1;break;}
        }
        if(sum)puts3();
        else puts2();
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_44986601/article/details/105629300