poj3630||hdoj1671(字典树)
Posted frankchen831x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3630||hdoj1671(字典树)相关的知识,希望对你有一定的参考价值。
题目链接: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 "); else printf("NO "); } return 0; }
以上是关于poj3630||hdoj1671(字典树)的主要内容,如果未能解决你的问题,请参考以下文章