int tire[(int)3e6+10][63];
int cnt[(int)3e6+10];
int get(char c){
if(c>='a'&&c<='z') return c-'a';
else if(c>='A'&&c<='Z') return 26+(c-'A');
return 52+(c-'0');
}
void solve(){
int n,q;cin>>n>>q;
int idx=0;
memset(tire, 0, sizeof(tire)); // 所有子节点指针置0
memset(cnt, 0, sizeof(cnt)); // 所有计数置0
auto built=[&](int u,string&s)->void{
for(char c:s){
int nx=get(c);
if(!tire[u][nx]) tire[u][nx]=++idx;
u=tire[u][nx];
cnt[u]++;//前缀用这个,完全匹配的放外面
}
};
for(int i=0;i<n;i++){
string s;cin>>s;
built(0,s);
}
while(q--){
string ss;cin>>ss;
int ans=0;
auto query=[&](int u,string &s)->void{
for(char c:s){
int nx=get(c);
if(!tire[u][nx]) return;
u=tire[u][nx];
}
ans=cnt[u];
};
query(0,ss);
cout<<ans<<endl;
}
}