#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 
View Code

 

以上是关于#1014 : Trie树的主要内容,如果未能解决你的问题,请参考以下文章

hiho1014(trie树)

HiHo1014 : Trie树(Trie树模板题)

hihoCoder 1014 Trie树

hihocoder1014 : Trie树

hihoCoder 1014 : Trie树(字典树)

#1014 : Trie树