版权声明:本文为博主原创作品, 转载请注明出处! https://blog.csdn.net/solider98/article/details/83862304
思路分析:
直接应用Trie树即可, 下面给出AC代码:
//CH1601_前缀统计
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 1e6 + 5;
int trie[MAX][26], nex[MAX], tot, cnt[MAX];//cnt[i]:trie[i]对应字符串结尾个数
char s[MAX];
int main(){
int N, M; scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++i){
int len = (scanf("%s", s + 1), strlen(s + 1)), k = 0;
for(int i = 1; i <= len; k = trie[k][s[i] - 'a'], ++i)
if(!trie[k][s[i] - 'a']) trie[k][s[i] - 'a'] = ++tot;
++cnt[k];
}
for(int i = 1; i <= M; ++i){
int len = (scanf("%s", s + 1), strlen(s + 1)), res = 0, k = 0;
for(int i = 1; i <= len; ++i){
if(!(k = trie[k][s[i] - 'a'])) break;
res += cnt[k];
}
cout << res << endl;
}
return 0;
}