给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1~SNSN中有多少个字符串是T的前缀。
输入字符串的总长度不超过106106,仅包含小写字母。
输入格式
第一行输入两个整数N,M。
接下来N行每行输入一个字符串SiSi。
接下来M行每行一个字符串T用以询问。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
输入样例:
3 2
ab
bc
abc
abc
efg
输出样例:
2
0
开始系统的搞字符串了。。
从字典树重新搞起,
入门题,en记录 i结点结束的字符串有几个
//KX
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int M= 1e6+7;
int ti[M][26],tot=1;
int en[M];
void in(char*s)
{
int l=strlen(s),p=1;
for(int i=0;i<l;i++)
{
int ch=s[i]-'a';
if(ti[p][ch]==0)ti[p][ch]=++tot;
p=ti[p][ch];
}
en[p]++;//p结点是一个字符串的末尾
}
int find(char *s)
{
int ans=0;
int l=strlen(s),p=1;
for(int i=0;i<l;i++)
{
int ch=s[i]-'a';
if(ti[p][ch]==0)break;
p=ti[p][ch];
ans+=en[p];
}
return ans;
}
char s[M];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",s),in(s);
int ans=0;
for(int i=1;i<=m;i++)
{
scanf("%s",s);
printf("%d\n",find(s));
}
return 0;
}