hdu1251——统计难题

字典树,也即tire树!

优点是:用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高!

 

字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。

#include #include #include typedef struct node { int cnt; struct node *next[28]; }*tree; tree tt; void insert(char str[]) { int i; tree p=tt,newnode; for(i=0;inext[str[i]-'a']!=NULL) { p=p->next [str[i]-'a']; p->cnt ++; } else { newnode=(tree)malloc(sizeof(node)); for(int j=0;j<26;j++) newnode->next [j]=NULL; p->next [str[i]-'a']=newnode; p=p->next [str[i]-'a']; p->cnt =1; } } } int find(char str[]) { tree p; p=tt; int i,j; for(i=0;inext [str[i]-'a']!=NULL) p=p->next [str[i]-'a']; else return 0; } return p->cnt ; } int main() { int i; char str[100]; tt=(tree)malloc(sizeof(node)); for(i=0;i<26;i++) tt->next [i]=NULL; tt->cnt =0; while(gets(str)!=NULL) { if(strcmp(str,"")==0) break; insert(str); } while(gets(str)!=NULL) { printf("%d/n",find(str)); } return 0; }  

 

 

你可能感兴趣的:(hdu1251——统计难题)