传送门:hdu-1251统计难题
基本的字典树,字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
如上图所示,每一个红色节点都一个单词,白色节点表示公共前缀
#include <bits/stdc++.h>
using namespace std;
const int maxnode=1e6+5;
const int sigma_size=26;
struct Trie{
int ch[maxnode][sigma_size];
int sz;
int num[maxnode];
Trie(){
sz=1;
memset(ch[0],0,sizeof(ch[0]));
memset(num,0,sizeof(num));
}
int idx(char c){ return c-'a';}
//插入字符串s,附加信息为v
void insert(char *s, int v){
int u=0,n=strlen(s);
for(int i=0; i<n; i++){
int c=idx(s[i]);
if(!ch[u][c]){ //结点不存在
memset(ch[sz],0,sizeof(ch[sz]));
num[sz]=0;
ch[u][c]=sz++;//新建结点
}
u=ch[u][c];//往下走
num[u]++;
}
}
int search(char *s){
int n=strlen(s);
int u=0;
for(int i=0; i<n; i++){
int c=idx(s[i]);
if(!ch[u][c])return 0;
u=ch[u][c];
}
return num[u];
}
};
Trie T;
int main(){
char s[15];
int flag=0;
while(gets(s),strcmp(s,"")){
T.insert(s,1);
}
while(gets(s)!=NULL){
printf("%d\n",T.search(s));
}
return 0;
}