1. 程式人生 > >Phone List HDU - 1671 字典樹

Phone List HDU - 1671 字典樹

題意:給出一堆一組一組的數字  判斷有沒有哪一個是另外一個的字首

思路:字典樹 插入的同時進行判斷  不過 當處理一組數字的時候 需要考慮的有兩點1.是否包含了其他的序列2.是否被其他序列包含

  剛開始開的1e4死活不過  1e5直接過了。。

 1 #include<bits/stdc++.h>
 2 #include<string>
 3 using namespace std;
 4 const int maxn=1e5+5;
 5 struct Trie{
 6     int size;
 7     int ch[maxn][10
]; 8 int isEnd[maxn]; 9 void init(){ 10 memset(ch,0,sizeof(ch)); 11 memset(isEnd,0,sizeof(isEnd)); 12 size=1; 13 } 14 bool insert(char*s){ 15 int rc=0,i=0; 16 int flag=1; 17 for(;s[i]!='\0';i++){ 18 int id=s[i]-'0'; 19 if
(ch[rc][id]==0){ 20 ch[rc][id]=size++; 21 flag=0; 22 } 23 if(isEnd[rc]==1)return 1; 24 rc=ch[rc][id]; 25 //if(isEnd[rc]==1)return 1; 26 27 } 28 isEnd[rc]=1; 29 return flag; 30 }
31 }trie; 32 char s[10000]; 33 int main(){ 34 int t; 35 scanf("%d",&t); 36 while(t--){ 37 int ok=0; 38 int n; 39 scanf("%d",&n); 40 trie.init(); 41 for(int i=0;i<n;i++){ 42 scanf("%s",s); 43 if(ok)continue; 44 if(trie.insert(s))ok=1; 45 } 46 if(ok)printf("NO\n"); 47 else printf("YES\n"); 48 } 49 return 0; 50 }