#include <iostream>
#include<algorithm>
using namespace std;
const int N=1000010;
int son[N][26];
int cnt[N]={0};
int pos=0;
void insert(char str[])
{
int p=0;
for(int i=0;str[i];i++)
{
int c=str[i]-'a';
if(son[p][c]==0)//如果是空结点,就创建一个新的结点
{
son[p][c]=++pos;
//cout<<"pos:"<<pos;
}
p=son[p][c];
//cout<<son[p][c]<<'?';
}
cnt[p]++;
//cout<<" p:"<<p<<" cnt_p"<<cnt[p]<<' ';
}
int query(char str[])
{
int p=0;
int num=0;
for(int i=0;str[i];i++)
{
int c=str[i]-'a';
if(son[p][c]==0)
{
break;
}
p=son[p][c]; //p存放的是str[i]
num+=cnt[p];
//cout<<num<<endl;
}
return num;
}
int main()
{
int n,m;
cin>>n>>m;
char str[N];
getchar();
for(int i=0;i<n;i++)//创建Trie树
{
cin.getline(str,N+1);
insert(str);
}
for(int i=0;i<m;i++)
{
cin.getline(str,N+1);
cout<<query(str)<<endl;
}
return 0;
}
写的时候看错了题目,把前缀关系看反了,以为是求T是s的前缀数目,增加了难度hhh。
最开始提交的时候把getchar(),写到了循环的里面,导致输入的时候每次都吞掉第一个字符串,调试好久才发现。