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 bbabbaabSample 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 }