字典树:很强大的数据结构,实现多个字符串的查找、对其个数的纪录以及对其子串的查询。
 连接:http://blog.csdn.net/chenzhenyu123456/article/details/46490539
这里讲下建树过程:
 
 准备:MAX 记录总节点数目 
 
- char str[1010][50];
- int ch[MAX][30];
- int word[MAX];
- int val[MAX];
- int sz;
 
 
初始化:
- void init()  
- {  
-     sz = 1;  
-     memset(ch[0], 0, sizeof(ch[0]));  
-     memset(word, 0, sizeof(word));  
- }   
 
返回字符的ascll码值:
- int idx(char x)  
- {  
-     return x - ‘a‘;  
- }  
 
插入字符串:
- void insert(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         if(!ch[u][c])
-         {  
-             memset(ch[sz], 0, sizeof(ch[sz]));
-             val[sz] = 0;  
-             ch[u][c] = sz++; 
-         }  
-         u = ch[u][c];  
-         word[u]++;
-     }  
-     val[u] = 1;
- }  
 
 
查找以字符串s为前缀的字符串 在字符串集中有多少个
- int findnum(char *s)
- {    
-     int i, j, l = strlen(s);    
-     int u = 0;    
-     for(i = 0; i < l; i++)    
-     {    
-         int c = idx(s[i]);    
-         if(!ch[u][c]) return 0;
-         u = ch[u][c];    
-     }    
-     return word[u];    
- }    
 
查找并输出字符串在串集里面唯一确定的最短前缀 :
- void findprefix(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;  
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         u = ch[u][c];
-         printf("%c", s[i]);  
-         if(word[u] == 1)
-         return ;  
-     }   
- }   
 
判断该字符串是不是串集里某个字符串前缀 :
- bool judgeprefix(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;  
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         u = ch[u][c];
-         if(word[u] == 1)
-         return true;  
-     }   
-     return false;
- }   
 
判断字符串是否由串集里的两个字符串构成: 假设该字符串分s1,s2两部分,这里只实现s1的查找
- bool finds(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;  
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         if(!ch[u][c])
-         return false;  
-         u = ch[u][c];  
-     }  
-     return val[u];
- }  
 
大模板:
- #include <cstdio>  
- #include <cstring>  
- #define MAX 50000+10  
- using namespace std;  
- char str[1010][50];
- int ch[MAX][30];
- int word[MAX];
- int val[MAX];
- int sz;
- int idx(char x)  
- {  
-     return x - ‘a‘;  
- }  
- void init()  
- {  
-     sz = 1;  
-     memset(ch[0], 0, sizeof(ch[0]));  
-     memset(word, 0, sizeof(word));  
- }   
- void insert(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         if(!ch[u][c])
-         {  
-             memset(ch[sz], 0, sizeof(ch[sz]));
-             val[sz] = 0;  
-             ch[u][c] = sz++; 
-         }  
-         u = ch[u][c];  
-         word[u]++;
-     }  
-     val[u] = 1;
- }  
- int findnum(char *s)
- {    
-     int i, j, l = strlen(s);    
-     int u = 0;    
-     for(i = 0; i < l; i++)    
-     {    
-         int c = idx(s[i]);    
-         if(!ch[u][c]) return 0;
-         u = ch[u][c];    
-     }    
-     return word[u];    
- }    
- void findprefix(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;  
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         u = ch[u][c];
-         printf("%c", s[i]);  
-         if(word[u] == 1)
-         return ;  
-     }   
- }   
- bool judgeprefix(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;  
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         u = ch[u][c];
-         if(word[u] == 1)
-         return true;  
-     }   
-     return false;
- }   
- bool finds(char *s)  
- {  
-     int i, j, len = strlen(s);  
-     int u = 0;  
-     for(i = 0; i < len; i++)  
-     {  
-         int c = idx(s[i]);  
-         if(!ch[u][c])
-         return false;  
-         u = ch[u][c];  
-     }  
-     return val[u];
- }  
 
字典树(转)
原文:http://www.cnblogs.com/handsomecui/p/4909330.html