第一次接触字典树的实现,先看到了一个指针实现的模板,觉得很好理解,用着也方便,先收集过来 :)
//字典树用来查询有公共前缀的单词有多少个,插入和查询的时间复杂度均为O(n)
#include<iostream>
#include<cstring>
#define N 300 //有N个单词
#define M 1000000//有M次查询
#define kind 26//26个英文字母
using namespace std;
struct Treenode
{
int count;
Treenode *next[kind];
Treenode(){
for(int i=0; i<kind; i++)
next[i]=NULL;
count=1;
}
};
void insert(Treenode *&root, char *word)
{
int i=0,j,l=strlen(word),branch;
Treenode *location=root;
if(location==NULL){
location=new Treenode();
root=location;
}
for(i=0; i<l; i++){
branch=word[i]-'a';
if(location->next[branch])
location->next[branch]->count++;
else
location->next[branch]=new Treenode();
location=location->next[branch];
}
}
int search(Treenode *&root, char *word)
{
int i, ans=0, l=strlen(word),branch;
Treenode *location=root;
if(location==NULL) return 0;
for(i=0; i<l; i++){
branch=word[i]-'a';
if(!location->next[branch])
return 0;
location=location->next[branch];
ans=location->count;
}
return ans;
}
int main()
{
int i,j,n,m;
char word[50];
Treenode *root=NULL;
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%s",word);
insert(root, word);
}
scanf("%d",&m);
for(i=0; i<m; i++){
scanf("%s",word);
printf("%d\n",search(root, word));
}
return 0;
}