字典树(TrieTree),常见应用于大量字符串的保存,统计,查找等操作,由于字符串的公共前缀没有重复保存,所以操作起来比较方便,效率很高,搜索引擎的文本词频统计就是它的经典应用之一。
HDU1251 统计难题
题目要求计算一个给定字符串在特定字符集中以某个单词的前缀身份出现的次数,裸字典树……
CODE:
#include<stdio.h>
const int MAX = 26;
typedef struct TrieNode{
int nodeCount;
struct TrieNode *next[MAX];
}TrieNode,* TrieTree;
//借鉴别人的方法,申请静态空间,比malloc方便一些
//出自:http://www.cnblogs.com/DiaoCow/archive/2010/04/19/1715337.html
TrieNode Memory[1000000];
int index=0;
TrieTree CreateTree(){
TrieNode *p;
p = &Memory[index++];
p->nodeCount = 1;
for(int i=0;i<MAX;i++){
p->next[i] = NULL;
}
return p;
}
void InsertTrie(TrieTree * root,char *s){
TrieTree p;
p = * root;
for(int i=0;s[i];i++){
int k = s[i] - 'a';
if(p->next[k])
p->next[k]->nodeCount++;
else
p->next[k] = CreateTree();
p = p->next[k];
}
}
int SearchTrie(TrieTree * root,char *s){
TrieTree p = * root;
for(int i=0;s[i];i++){
int k = s[i]-'a';
if(p->next[k] == NULL)return 0;
p = p->next[k];
}
return p->nodeCount;
}
void Delete(TrieTree p){
if(p!=NULL){
for(int i=0;i<MAX;i++){
if(p->next[i] != NULL)Delete(p->next[i]);
delete p;
p = NULL;
}
}
}
int main()
{
char str[11];
TrieTree root = CreateTree();
while(gets(str) && str[0]){
InsertTrie(&root,str);
}
while(gets(str)){
printf("%d\n",SearchTrie(&root,str));
}
return 0;
}