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

poj3630||hdoj1671(字典树)

时间:2019-11-10 13:31:33      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:har   turn   while   str   题目   ems   思路   ring   ace   

题目链接:https://vjudge.net/problem/HDU-1671

题意:给定n个字符串,判断是否存在一些字符串是另一些字符串的前缀。

思路:

  套模板,存在前缀可能是两种情况:

    当前字符串枚举位数时已经存在之前的字符串了;(即已经存在911,当前插入9112)

      或者当前字符串枚举完之后,该结点还有子结点。(即已经存在9112,当前插入911)

AC code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxn=1e6+5;
int T,n,trie[maxn][12],key[maxn],cnt;
int flag;
char str[12];

void insert(char *s){
    int len=strlen(s),u=0;
    for(int i=0;i<len;++i){
        int t=s[i]-0;
        if(!trie[u][t]){
            ++cnt;
            memset(trie[cnt],0,sizeof(trie[cnt]));
            key[cnt]=0;
            trie[u][t]=cnt;
        }
        if(key[trie[u][t]]){
            flag=0;
            return;
        }
        u=trie[u][t];
        if(i==len-1) key[u]=1;
    }
    for(int i=0;i<10;++i)
        if(trie[u][i]){
            flag=0;
            break;
        }
}

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        memset(trie[0],0,sizeof(trie[0]));
        flag=1,cnt=0;
        for(int i=0;i<n;++i){
            scanf("%s",str);
            if(flag) insert(str);
        }
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 

poj3630||hdoj1671(字典树)

标签:har   turn   while   str   题目   ems   思路   ring   ace   

原文地址:https://www.cnblogs.com/FrankChen831X/p/11829478.html

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