#1014 : Trie树
Posted qq-1585047819
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#1014 : Trie树相关的知识,希望对你有一定的参考价值。
输入
输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。
在20%的数据中n, m<=10,词典的字母表大小<=2.
在60%的数据中n, m<=1000,词典的字母表大小<=5.
在100%的数据中n, m<=100000,词典的字母表大小<=26.
本题按通过的数据量排名哦~
输出
对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。
样例输入
5 babaab babbbaaaa abba aaaaabaa babaababb 5 babb baabaaa bab bb bbabbaab
样例输出
1 0 3 0 0
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 const int N=400005; 7 int trie[N][27]; 8 int sum[N]; 9 int tot; 10 int n,m; 11 char s[27]; 12 13 void Insert() 14 int len=strlen(s); 15 int root=0; 16 for(int i=0;i<len;i++) 17 int id=s[i]-‘a‘; 18 if(!trie[root][id]) trie[root][id]=++tot; 19 sum[trie[root][id]]++; 20 root=trie[root][id]; 21 22 23 24 int Search() 25 int len=strlen(s); 26 int root=0; 27 for(int i=0;i<len;i++) 28 int id=s[i]-‘a‘; 29 if(!trie[root][id]) return 0; 30 root=trie[root][id]; 31 32 return sum[root]; 33 34 35 int main() 36 37 scanf("%d",&n); 38 for(int i=1;i<=n;i++) 39 scanf("%s",s); 40 Insert(); 41 42 scanf("%d",&m); 43 for(int i=1;i<=m;i++) 44 scanf("%s",s); 45 printf("%d\n",Search()); 46 47 return 0; 48
以上是关于#1014 : Trie树的主要内容,如果未能解决你的问题,请参考以下文章