第一次接触字典树的实现,先看到了一个指针实现的模板,觉得很好理解,用着也方便,先收集过来 :)

//字典树用来查询有公共前缀的单词有多少个,插入和查询的时间复杂度均为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;
}