给定N个字符串S1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1~SN中有多少个字符串是T的前缀。
输入字符串的总长度不超过106,仅包含小写字母。
输入格式
第一行输入两个整数N,M。
接下来N行每行输入一个字符串Si。
接下来M行每行一个字符串T用以询问。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
输入样例:
3 2
ab
bc
abc
abc
efg
输出样例:
2
0
#include<bits/stdc++.h>
using namespace std;
int pos=1,trie[1000010][26],num[1000010];
void Insert(string s){
int c=0;
for(int i=0;i<s.size();i++){
int n=s[i]-'a';
if(trie[c][n]==0)
trie[c][n]=pos++;
c=trie[c][n];
}
num[c]++;//这里将插入的串当做一个整体,因为它是前缀
}
int Find(string s){
int c=0,ans=0;
for(int i=0;i<s.size();i++){
int n=s[i]-'a';
if(!trie[c][n])
break;//没有不要反回0,停下就好,不然会输出0;
c=trie[c][n];
ans+=num[c];
}
return ans;
}
int main(){
int n,m;
cin>>n>>m;
while (n--){
string s;
cin>>s;
Insert(s);
}
while(m--){
string s;
cin>>s;
cout<<Find(s)<<endl;
}
return 0;
}