Trie入门--Poj3630 Phone List

Posted cutemush

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Trie入门--Poj3630 Phone List相关的知识,希望对你有一定的参考价值。

就Trie的插入和查找

//注意此题是找到前缀输出no,否则输出yes 
#include<bits/stdc++.h>
using namespace std;
int n,t,flag,cnt,trie[110001][21];
int ed[110001],vis[110001];
char ch[21];
void up()
{
    flag=0;cnt=0;
    memset(ed,0,sizeof(ed));
    memset(vis,0,sizeof(vis));
    memset(trie,0,sizeof(trie));
}
void find()
{
    int nxt=0,len=strlen(ch+1);
    for(int i=1;i<=len;i++)
    {
        int num=ch[i]-0;
        if(!trie[nxt][num])
             trie[nxt][num]=++cnt;
        nxt=trie[nxt][num];
        //取出它的下一条边 
        if(vis[nxt]&&i==len)
        //如果这条边已存在,且i==len,则说明找到前缀 
        { 
             flag=1;
             return;
        }
        vis[nxt]=1;
        // 加入这条边到trie中 
        if(ed[nxt])
        //如果这条边被打上结尾标记的话 
           {  
                flag=1;
                return;
           }
    }
    ed[nxt]=1;
    //打上结尾标记 
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);up();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",ch+1);
            if(!flag)
               {
                  find();
                  
               }
        }
        if(flag)
             printf("NO
");
        else 
             printf("YES
");
    }
    return 0;
}



#include<cstring>
#include<iostream>
using namespace std;
int a[100010][11],tot,End[100010];
void ins(char *str)
{
    int n=strlen(str),p=0;
    for(int i=0;i<n;i++)
    {
        int l=str[i]-0;
        if(!a[p][l])a[p][l]=++tot;
        p=a[p][l];
        End[p]++;
    }
}
int find(char *str)
{
    int n=strlen(str),p=0;
    for(int i=0;i<n;i++)
    {
        int l=str[i]-0;
        p=a[p][l];
        if(!p)return 0;
    }
    return End[p]-1;
    //因为在查找的时候,一定会找到自己,所以要减去1
    //这样才能知道是否存在其它字符串是其子串 
}
char str[10010][11];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        tot=0;
        memset(a,0,sizeof(a));
        memset(str,0,sizeof(str));
        memset(End,0,sizeof(End));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",str[i]);
            ins(str[i]);
        }
        bool flag=0;
        for(int i=1;i<=n;i++)
            if(find(str[i]))
            {
                flag=1;
                break;
            }
        printf(flag==1?"NO
":"YES
");
    }
    return 0;
}

 

以上是关于Trie入门--Poj3630 Phone List的主要内容,如果未能解决你的问题,请参考以下文章

POJ3630——Phone List(Trie)

POJ3630-Phone List-(字典树)

poj3630:Phone List——题解

POJ 3630 Trie

POJ-3630-Phone List(字典树)

poj 3630 Phone List