转自 http://blog.csdn.net/acmmmm/article/details/12250267
#define Word_Len 1000
#define Sigma_size 30
struct Trie{
int ch[Word_Len][Sigma_size]; //Word_Len是字典树的节点数 若都是小写字母Sigma_size=26
int Have_word[Word_Len]; //这个节点下有几个单词
int val[Word_Len]; // 这个节点附带的信息,初始化为0表示这个节点不存在单词,所以节点带的信息必须!=0
int sz ; //当前节点数
Trie() //初始化字典树
{ sz = 1; memset(ch[0], 0, sizeof(ch[0])); memset(val, 0, sizeof(val)); memset(Have_word, 0, sizeof(Have_word));}//初始化
int idx(char c){ return c-'a';} //字符串编号
void insert(char *s, int v){ //把v数字加给 s单词最后一个字母
int u = 0, len = strlen(s);
for(int 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];
}
//现在的u就是这个单词的最后一个位置
val[u] = v;
Have_word[u]++; //若这个单词是新建的
}
void Creat(char *s){
int u = 0, len = strlen(s);
bool creat = false;
for(int 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++;
creat = true;
}
u = ch[u][c];
}
if(creat) Have_word[u]++;
}
int find_word(char *s){
int u = 0, len = strlen(s);
bool creat = false;
for(int i = 0; i < len; i++){
int c = idx(s[i]);
if(!ch[u][c]) //节点不存在
return 0;
u = ch[u][c];
}
return Have_word[u];
}
};