http://acm.hdu.edu.cn/showproblem.php?pid=1251
通过这道题学习一下Trie字典树.
      #include <iostream>
      
        
#include 
      
      <fstream>
      
        
#include 
      
      <vector>
      
        
#include 
      
      <
      
        string
      
      >
      
        
#include 
      
      <algorithm>
      
        
#include 
      
      <map>
      
        
#include 
      
      <stack>
      
        
#include 
      
      <cmath>
      
        
#include 
      
      <queue>
      
        
#include 
      
      <
      
        set
      
      >
      
        
#include 
      
      <list>
      
        
#include 
      
      <cctype>
      
        
#include 
      
      <stdio.h>
      
        
#include 
      
      <stdlib.h>
      
        
#include 
      
      <
      
        string
      
      .h>
      
        #define
      
       REP(i,j,k) for(int i = j ; i < k ; ++i)
      
        #define
      
       MAXV (1000)
      
        #define
      
       INF (0x6FFFFFFF)
      
        #define
      
       MAX 26
      
        using
      
      
        namespace
      
      
         std;
typedef 
      
      
        struct
      
      
         Trie
{
    Trie 
      
      *
      
        next[MAX];
    
      
      
        int
      
       v;
      
        //
      
      
        这里表示该字符前缀出现的次数
      
      
        };
Trie 
      
      *
      
        root;
      
      
        void
      
       Insert(
      
        char
      
       *
      
        str)
{
    Trie 
      
      *current =
      
         root;
    
      
      
        int
      
        len=
      
        strlen(str);
    
      
      
        if
      
      (len==
      
        0
      
      ) 
      
        return
      
      
         ;
    REP(i,
      
      
        0
      
      
        ,len)
    {
        
      
      
        //
      
      
        若节点存在,则直接访问下一个节点,并此前缀出现次数+1
      
      
        if
      
      (current->next[str[i]-
      
        '
      
      
        a
      
      
        '
      
      ]!=
      
        NULL)
        {
            current
      
      =current->next[str[i]-
      
        '
      
      
        a
      
      
        '
      
      
        ];
            current
      
      ->v++
      
        ;
        }
        
      
      
        //
      
      
        若节点不存在,则新建节点并初始化
      
      
        else
      
      
        
        {
            current
      
      ->next[str[i]-
      
        '
      
      
        a
      
      
        '
      
      ]=(Trie*)malloc(
      
        sizeof
      
      
        (Trie));
            current
      
      =current->next[str[i]-
      
        '
      
      
        a
      
      
        '
      
      
        ];
            REP(i,
      
      
        0
      
      ,
      
        26
      
      ) current->next[i]=
      
        NULL;
            current
      
      ->v=
      
        1
      
      
        ;
        }
    }
}
      
      
        int
      
       Find(
      
        char
      
       *
      
        str)
{
    
      
      
        int
      
       len=
      
        strlen(str);
    
      
      
        struct
      
       Trie *current=
      
        root;
    
      
      
        if
      
      (len==
      
        0
      
      ) 
      
        return
      
      
        0
      
      
        ;
    REP(i,
      
      
        0
      
      
        ,len)
    {
        
      
      
        //
      
      
        如果关键词本字符存在,则访问下一个节点
      
      
        if
      
      (current->next[str[i]-
      
        '
      
      
        a
      
      
        '
      
      ]!=
      
        NULL)
            current
      
      =current->next[str[i]-
      
        '
      
      
        a
      
      
        '
      
      
        ];
        
      
      
        else
      
      
        return
      
      
        0
      
      ;
      
        //
      
      
        不存在直接返回0
      
      
            }
    
      
      
        return
      
       current->v;
      
        //
      
      
        返回该前缀出现次数
      
      
        }
      
      
        void
      
      
         Init()
{
    root
      
      =(Trie *)malloc(
      
        sizeof
      
      
        (Trie));
    REP(i,
      
      
        0
      
      ,
      
        26
      
      ) root->next[i]=
      
        NULL;
    root
      
      ->v=
      
        1
      
      
        ;
}
      
      
        int
      
      
         main()
{
    Init();
    
      
      
        char
      
       str[
      
        11
      
      
        ];
   
      
      
        //
      
      
         freopen("in.txt","r",stdin);
      
      
        while
      
      (gets(str)&&strcmp(str,
      
        ""
      
      )!=
      
        0
      
      
        )
            Insert(str);
    
      
      
        char
      
       tmp[
      
        11
      
      
        ];
    
      
      
        while
      
      (~scanf(
      
        "
      
      
        %s
      
      
        "
      
      
        ,tmp))
        printf(
      
      
        "
      
      
        %d\n
      
      
        "
      
      
        ,Find(tmp));
    
      
      
        return
      
      
        0
      
      
        ;
}
      
    
  


 
					 
					