SPOJ 4003 Phone List 题解

题面

啊~,很水的一道trie树模板题;

当两个串存在关系时情况有两种:

若当前串插入后没有任何新建节点,则该串肯定是之前插入的某个串的前缀;

若在插入的时候,有某个经过的节点带有某串结尾的标记,则之前插入的某个串是当前串的

#include<bits/stdc++.h>
using namespace std;
int n,tot;
int ch[100010][20];
bool bo[100010];
char s[20];
inline bool insert(char *s)
{
    int len=strlen(s);
    int u=1;
    bool flag=false;
    for(int i=0;i<len;i++){
            int c=s[i]-'0';
            if(!ch[u][c]) ch[u][c]=++tot;      
            else if(i==len-1) flag=1;          
            u=ch[u][c];
            if(bo[u]){
                flag=1;
            }
    }
    bo[u]=1;
    return flag;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        memset(ch,0,sizeof(ch));
        memset(bo,false,sizeof(bo));
        scanf("%d",&n);
        tot=1;     
        bool ans=0;
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            if(insert(s)) ans=1;        
        }
        if(ans) cout<<"NO"<<endl;         
        else cout<<"YES"<<endl;
    }
    return 0;
}

 

posted @ 2019-08-02 17:05  神之右大臣  阅读(165)  评论(0编辑  收藏  举报