前缀统计
题目
输入
输出
对于每个询问,输出一个整数表示答案
每个答案占一行
输入样例
3 2
ab
bc
abc
abc
efg
输出样例
2
0
解题思路
我们把nnn个字符都存入TrieTrieTrie,然后记录一个特殊值来表示字符串的结尾是TrieTrieTrie上的节点xxx的字符串个数
程序如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n, m, e[1000001], trie[1000001][26], tot = 1, ans;
char s[1000001], ss[1000001];
void handle()
{
scanf("%s", s + 1);
int len = strlen(s + 1), p = 1;
for(int i = 1; i <= len; ++i)
{
int c = s[i] - 'a';
if(!trie[p][c])
trie[p][c] = ++tot;
p = trie[p][c];
}
e[p]++;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i)
handle();
for(int i = 1; i <= m; ++i)
{
scanf("%s", ss + 1);
int len = strlen(ss + 1), p = 1;
ans = 0;
for(int j = 1; j <= len; ++j)
{
int c = ss[j] - 'a';
if(trie[p][c])
p = trie[p][c], ans += e[p];
else break;
}
printf("%d\n",ans);
}
return 0;
}