前缀树Trie

 

Trie可理解为一个能够快速插入与查询的集合,无论是插入还是查询所需时间都为O(m)

 

模板如下:

 

 1 const int maxnode = 1000+10;
 2 const int sigma_size = 26; 
 3 
 4 struct Trie{
 5 int ch[maxnode][sigma_size];
 6 int val[maxnode];
 7 int sz;
 8 
 9   void clear(){ sz=1; memset(ch[0],0,sizeof(ch[0])); }
10   int ID(char c){ return c='a'; };
11   
12   void insert(char* s,int v){ //向Trie中插入 
13       int u=0 , n=strlen(s);
14       for(int i=0;i<n;i++) { 
15           int c=ID(s[i]);
16           if(!ch[u][c]){
17               memset(ch[sz],0,sizeof(ch[sz])); //初始化子结点组 
18               val[sz]=0;        //中间结点val=0 
19               ch[u][c]= sz++;  //建立子结点 
20         }
21         u=ch[u][c];          //往下走 
22       }
23       val[u]=v;
24   }
25   
26   int find(char *s){     //查找s是否存在 
27       int n=strlen(s);
28       int u=0;
29       for(int i=0;i<n;i++){
30           int c=ID(s[i]);
31           if(!ch[u][c]) return false;
32           u=ch[u][c];
33       }
34       return val[u];  //是否为尾 
35   }
36 };