hiho1014 Trie树

Input

输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词。接下来的一行为一个正整数m,表示小Hi询问的次数,其后m行,每一行一个字符串,该字符串由不超过10个的小写英文字母组成,表示小Hi的一个询问。

在20%的数据中n, m<=10,词典的字母表大小<=2.

在60%的数据中n, m<=1000,词典的字母表大小<=5.

在100%的数据中n, m<=100000,词典的字母表大小<=26.

本题按通过的数据量排名哦~

Output

对于小Hi的每一个询问,输出一个整数Ans,表示词典中以小Hi给出的字符串为前缀的单词的个数。

Sample Input

5
babaab
babbbaaaa
abba
aaaaabaa
babaababb
5
babb
baabaaa
bab
bb
bbabbaab

Sample Output

1
0
3
0
0



注意数组大小。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 
 7 using namespace std;
 8 
 9 const int N = 10000010;
10 
11 int ch[N][30], sz[N], tot = 1, n;
12 
13 char str[20];
14 
15 #define walk for(int i = 0, rt = 1, t ; (t = str[i] - 'a'), str[i] ; i ++)
16 
17 void ins() {
18     walk {
19         if(!ch[rt][t]) ch[rt][t] = ++ tot;
20         sz[rt = ch[rt][t]] ++;
21     }
22 }
23 
24 int ask() {
25     walk {
26         if(!str[i + 1]) return sz[ch[rt][t]];
27         if(!(rt = ch[rt][t])) return 0;
28     }
29     return 0;
30 }
31 
32 int main() {
33     scanf("%d", &n);
34     while(n --)
35         scanf("%s", str), ins();
36     scanf("%d", &n);
37     while(n --)
38         scanf("%s", str), printf("%d\n", ask());
39 }
View Code

 

posted @ 2017-08-13 20:11  KingSann  阅读(140)  评论(0编辑  收藏  举报