模板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树(字典树)的主要内容,如果未能解决你的问题,请参考以下文章