Trie树
Posted bounce
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Trie树相关的知识,希望对你有一定的参考价值。
很多时候以为自己能记得做过的题目,可是实际上做过了几乎就不记得了。。。。。。。sad,于是还是记录一下吧。
题目:
对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。
样例输入
5 babaab babbbaaaa abba aaaaabaa babaababb 5 babb baabaaa bab bb bbabbaab
算法:
记录一个Trie树,trie树的struct的内容包括,节点的内容,Trie *next[26],因为有26个字母,一个ans记录访问过的次数。
分为两步,1:依次读取每条字符串,记录节点,若节点数据为null则记录,对于每个字符cnt++。
2.判断出现的次数,直接依次读取,知道访问到了那个节点,得到节点的cnt.
实现:
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 const int MAXN=105; 7 8 struct Trie{ 9 char ch; 10 int cnt; 11 Trie *next[26]; 12 Trie(){ 13 cnt=0; 14 for(int i=0;i<26;i++){ 15 next[i]=NULL; 16 } 17 } 18 }; 19 Trie root; 20 int ans; 21 void insertWord(char *str){ 22 int len=strlen(str); 23 Trie *head=&root; 24 for(int i=0;i<len;i++){ 25 int idx=str[i]-‘a‘; 26 if(head->next[idx]==NULL){ 27 Trie * node=new Trie; 28 node->ch=str[i]; 29 head->next[idx]=node; 30 } 31 head=head->next[idx]; 32 head->cnt++; 33 34 } 35 } 36 void queryWord(char *str){ 37 Trie* head=&root; 38 int len=strlen(str); 39 ans=0; 40 for(int i=0;i<len;i++){ 41 int idx=str[i]-‘a‘; 42 if(head->next[idx]==NULL)return ; 43 else{ 44 head=head->next[idx]; 45 } 46 } 47 ans=head->cnt; 48 } 49 int main(int argc, const char * argv[]) { 50 char str[MAXN]; 51 int n,m; 52 cin>>n; 53 for(int i=0;i<n;i++){ 54 cin>>str; 55 insertWord(str); 56 } 57 cin>>m; 58 for(int i=0;i<m;i++){ 59 cin>>str; 60 ans=0; 61 queryWord(str); 62 cout<<ans<<endl; 63 } 64 }
以上是关于Trie树的主要内容,如果未能解决你的问题,请参考以下文章