wanwang @ 2024-07-19 16:44:10
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,ABC=60;
inline int read(){
int XX=0,FF=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
FF*=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
XX=XX*10+ch-48;
ch=getchar();
}
return XX*FF;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
int cnt[N];
int re(char x){
if(x>='A'&&x<='Z')return x-'A';
else if(x>='a'&&x<='z')return x-'a'+26;
else return x-'0'+52;
}
struct trie{
struct node{
int ne[ABC];
int flag;
void init(){
for(int i=0;i<=ABC;i++)ne[i]=0;
flag=0;
}
}node[N];
int tot;
}T;
void t_init(trie &T){
T.tot=0;
T.node[0].init();
}
void insert(trie &T,string str){
int p=0,len=str.length();
for(int i=0;i<len;i++){
int id=re(str[i]);
if(T.node[p].ne[id]==0){
T.node[++T.tot].init();
T.node[p].ne[id]=T.tot;
}
p=T.node[p].ne[id];
cnt[p]++;
}
T.node[p].flag=1;
}
int ask(trie &T,string str){
int p=0,len=str.length();
for(int i=0;i<len;i++){
int id=re(str[i]);
if(T.node[p].ne[id]==0)return 0;
p=T.node[p].ne[id];
}
return cnt[p];
}
int t,n,q;
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
t=read();
while(t--){
t_init(T);
n=read();
q=read();
for(int i=0;i<=N;i++)cnt[i]=0;
for(int i=1;i<=n;i++){
string s;
cin>>s;
insert(T,s);
}
for(int i=1;i<=q;i++){
string s;
cin>>s;
write(ask(T,s));
puts("");
}
}
return 0;
}