#include <bits/stdc++.h>
using namespace std;
int n,m;
int tire[1000010][30];
int ind = 0;
int cnt[1000000];
void add(string s){
int p = 0;
int len = s.size();
for(int i=0;i<len;i++){
int u = s[i] - '0';
if( !tire[p][u]) tire[p][u] = ++ind;
p = tire[p][u];
}
cnt[p]++;
}
int query(string s){
int p = 0 ;
int res = 0;
for(int i=0;i<s.size();i++){
int u = s[i] - '0';
if( !tire[p][u]) return res;
p = tire[p][u];
res += cnt[p];
}
return res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s;
add(s);
}
while(m--){
string s;
cin>>s;
cout<<query(s)<<"\n";
}
}
本质上来说就是一个tire树的板子,无非就是统计前缀,每一个位置都加上cnt