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

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