题目地址:统计难题
字典树结构用处处理字符串的问题非常方便。
建一棵树,树的每个结点初始都有26个空指针指向儿子结点,表示26个英文字母,根节点root不表示字母。建立一个insert方法插入单词,具有公共前缀的单词公共部分不需要重复插入,这就节省了空间。用search方法对树进行搜索。使用字典树是种折中的做法,和哈希表比起来节省了大量内存,但是速度也当然变慢了
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct trie{ int count; trie* next[26]; trie(){ count = 0; for(int i=0;i<26;i++){ next[i] = NULL; } } }; trie *p,*root = new trie(); void insert(char* s){ p = root; for(int i=0;s[i]!='\0';i++){ int k = s[i] - 'a'; if(p->next[k]==NULL) p->next[k] = new trie(); p = p->next[k]; p->count++; } } int search(char* s){ p = root; for(int i=0;s[i]!='\0';i++){ int k = s[i] - 'a'; if(p->next[k]==NULL) return 0; p = p->next[k]; } return p->count; } int main(){ char s[11]; while(gets(s)){ int len = strlen(s); if(len==0) break; insert(s); } while(gets(s)){ cout<<search(s)<<endl; } return 0; }