【模板】trie树(字典树)

本文基于https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int amn=1e5+5;
 4 int trie[amn][26],tid;
 5 bool isw[amn];
 6 int sum[amn];
 7 void init(){
 8     memset(isw,0,sizeof isw);
 9     memset(trie,0,sizeof trie);
10     memset(sum,0,sizeof sum);
11     tid=0;  ///节点在整个树中的序号
12 }
13 void insert(char *s){   ///插入一个单词,如果想查询后缀就反向插入
14     int len=strlen(s),rt=0;
15     for(int i=0;i<len;i++){
16         int id=s[i]-'a';    ///看选择当前节点的哪个儿子
17         if(!trie[rt][id])
18             trie[rt][id]=++tid;
19         sum[rt]++;  ///前缀统计
20         rt=trie[rt][id];
21     }
22     isw[rt]=1;  ///结尾单词标记
23 }
24 bool isword(char *s){   ///查询是否存在这个单词
25     int len=strlen(s),rt=0;
26     for(int i=0;i<len;i++){
27         int id=s[i]-'a';
28         if(!trie[rt][id])return 0;
29         rt=trie[rt][id];
30     }
31     return isw[rt];
32 }
33 bool isprefix(char *s){ ///查询是否存在这个前缀
34     int len=strlen(s),rt=0;
35     for(int i=0;i<len;i++){
36         int id=s[i]-'a';
37         if(!trie[rt][id])return 0;
38         rt=trie[rt][id];
39     }
40     return 1;
41 }
42 int prefix_sum(char *s){///查询当前前缀出现的次数
43     int len=strlen(s),rt=0;
44     for(int i=0;i<len;i++){
45         int id=s[i]-'a';
46         if(!trie[rt][id])return 0;
47         rt=trie[rt][id];
48     }
49     return sum[rt];
50 }
51 int main(){
52     init();
53     char *s="hello",*s1="he";
54     insert(s);
55     printf("isword:%d isprefix:%d prefix_sum:%d\n",isword(s),isprefix(s1),prefix_sum(s1));
56 }

猜你喜欢

转载自www.cnblogs.com/brainm/p/11259933.html