模板在此
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+110;
int read(){
int x=0,f=1;char c=getchar();
while(c>'9' || c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return x*f;
}
int T,n,q,t[N][65],rt,newpos,cnt[N];char s[N];
int tn(char sc){
if(sc>='A' && sc<='Z')return sc-'A'+1;
if(sc>='a' && sc<='z')return sc-'a'+1+26;
if(sc>='0' && sc<='9')return sc-'0'+1+26+26;
return 0;
}
void Clear(int u){
for(int i=1;i<=26+26+10;i++){
if(t[u][i]){
Clear(t[u][i]);
t[u][i]=0;
}
}
return;
}
void solve(){
for(int i=1;i<=newpos;i++)cnt[i]=0;Clear(rt);
rt=newpos=1;
n=read(),q=read();
for(int i=1;i<=n;i++){
scanf("%s",s);int len=strlen(s),np=rt;
for(int j=0;j<len;j++){
int w=tn(s[j]);
if(t[np][w])np=t[np][w];
else np=t[np][w]=++newpos;
cnt[np]++;
}
}
for(int i=1;i<=q;i++){
scanf("%s",s);int len=strlen(s),np=rt,flag=1;
for(int j=0;j<len;j++){
int w=tn(s[j]);
if(t[np][w])np=t[np][w];
else{flag=0;break;}
}
if(flag)printf("%d\n",cnt[np]);
else printf("0\n");
}
return;
}
int main(){
T=read();
while(T--)solve();
return 0;
}