#include<iostream>
using namespace std;
const int N=1000010,M=500000;
int son[M][26];
int cnt[N];
char str[N];
int index;
void insert(){
int p = 0;
for(int i=0;str[i];i++){
int s = str[i]-'a';
if(!son[p][s]) son[p][s]=++index;//没有就创建一个
p = son[p][s];//到下一个
}
cnt[p]++;//结尾加一次
}
int search(){
int p = 0,ans=0;
for(int i=0;str[i];i++){
int s = str[i]-'a';
if(!son[p][s]) return ans;
p = son[p][s];
ans+=cnt[p];
}
return ans;
}
int main(void){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>str;
insert();
}
for(int i=0;i<m;i++){
cin>>str;
cout<<search()<<endl;
}
return 0;
}
字典树求解统计问题
于 2022-01-20 09:32:29 首次发布