HDU 1671 字典樹(判斷是否有一個串是另一個串的子串)。
阿新 • • 發佈:2018-11-22
給你多個由0-9構成的字串集合,問你這個集合中是否有一個字串是其他字串的字首?
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxnode=100000+1000; const int sigma_size=10; struct Trie { int ch[maxnode][sigma_size]; int val[maxnode];//非單詞節點為0,單詞節點為1 int sz; void init() { sz=1; val[0]=0; memset(ch[0],0,sizeof(ch[0])); } bool insert(char *s) { bool ok=true; int n=strlen(s),u=0; for(int i=0;i<n;i++) { int id=s[i]-'0'; if(ch[u][id]==0) { ch[u][id]=sz; val[sz]=0; memset(ch[sz],0,sizeof(ch[sz])); sz++; } u=ch[u][id]; if(val[u]>0)//存在當前插入串s的字首 ok=false; } val[u]=1; if(ok) { for(int i=0;i<sigma_size;i++) if(ch[u][i]!=0)//存在包含當前插入串的長串 { ok=false; break; } } return ok; } }; Trie trie; char word[20]; int main() { int kase; scanf("%d",&kase); while(kase--) { int n; scanf("%d",&n); trie.init(); bool ok=true; for(int i=0;i<n;i++) { scanf("%s",word); if(ok) ok=trie.insert(word); } if(ok)printf("YES\n"); else printf("NO\n"); } return 0; }