题目地址:统计难题
字典树结构用处处理字符串的问题非常方便。
建一棵树,树的每个结点初始都有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;
}