通常寫的字典樹都是雙數組的形式,可是當字符的數量不少時,就會佔用大量的內存,初始化操做也會變慢。這時,就能夠用左孩子右兄弟的寫法,來以時間換空間。node
下面是本身寫的一個:ios
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 const int maxnode=100000; 8 9 struct Trie 10 { 11 char ch[maxnode]; 12 int left[maxnode],right[maxnode],cnt; 13 bool flag[maxnode]; 14 15 Trie(){} 16 void init() 17 { 18 cnt=1; 19 left[0]=right[0]=ch[0]=0; 20 flag[0]=false; 21 //memset(flag,false,sizeof(flag)); 22 } 23 24 void insert(const char* str) 25 { 26 int len=strlen(str),u=0,j; 27 for(int i=0;i<len;i++) 28 { 29 for(j=left[u];j;j=right[j]) 30 { 31 if(ch[j]==str[i]) break; 32 } 33 if(j==0)///a new node 34 { 35 j=cnt++; 36 left[j]=0;ch[j]=str[i]; 37 flag[j]=false; 38 right[j]=left[u]; 39 left[u]=j; 40 } 41 u=j; 42 } 43 flag[j]=true; 44 } 45 46 bool query(const char* str) 47 { 48 int len=strlen(str),u=0,j; 49 for(int i=0;i<len;i++) 50 { 51 for(j=left[u];j;j=right[j]) 52 { 53 if(ch[j]==str[i]) break; 54 } 55 if(j==0) return false; 56 u=j; 57 } 58 return flag[j]; 59 } 60 61 }tree; 62 63 int main() 64 { 65 char dic[200]; 66 int d; 67 tree.init(); 68 while(cin>>d>>dic) 69 { 70 if(d==1) 71 { 72 tree.insert(dic); 73 } 74 else if(d==2) 75 { 76 cout<<tree.query(dic)<<endl; 77 } 78 } 79 return 0; 80 }