码迷,mamicode.com
首页 > 其他好文 > 详细

Trie入门--Poj3630 Phone List

时间:2020-02-02 17:59:17      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:int   入门   strlen   c++   col   end   name   存在   one   

就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\n");
        else 
             printf("YES\n");
    }
    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\n":"YES\n");
    }
    return 0;
}

 

Trie入门--Poj3630 Phone List

标签:int   入门   strlen   c++   col   end   name   存在   one   

原文地址:https://www.cnblogs.com/cutemush/p/12252741.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!