字典树

 1 const int maxn = 4e5 + 5;
 2 int trie[maxn][26];
 3 int color[maxn];
 4 int vis[maxn];
 5 int k = 1;
 6 
 7 void insert(string w){
 8     int len = w.size();
 9     int p = 0;
10     for (int i = 0; i < len; i++) {
11         int c = w[i] - 'a';
12         if (!trie[p][c]) {
13             trie[p][c] = k;
14             k++;
15         }
16         p = trie[p][c];
17         vis[p]++;
18     }
19     color[p] = 1;
20 }
21 
22 int search(string s) {  //寻找所有前缀为s的串数
23     int len = s.size();
24     int p = 0;
25     for (int i = 0; i < len; i++) {
26         int c = s[i] - 'a';
27         if (!trie[p][c])
28             return 0;
29         p = trie[p][c];
30     }
31     return vis[p];
32 }
33 
34 int main()
35 {
36     int t, q;  //总串数 访问数
37     string s;
38     cin >> t >> q;
39     while (t--) {
40         cin >> s;
41         insert(s);
42     }
43     while (q--) {
44         cin >> s;
45         printf("%d\n", search(s));
46     }
47     return 0;
48 }

 

posted @ 2020-02-06 12:38  Kiana-  阅读(94)  评论(0)    收藏  举报