模板trie树(字典树)

Posted brainm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板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 

 

以上是关于模板trie树(字典树)的主要内容,如果未能解决你的问题,请参考以下文章

模板trie树(字典树)

hdu2027 trie树 字典树模板

trie字典树模板题

字典树(trie)

字典树(Trie树)

01字典树及其模板