#include<bits/stdc++.h>
using namespace std;
int n,m,tot=1,e;
string w[10010],q;
int tree[500010][40],num[500010];
int vis[500010];
int ord(char ch){
return ch-'a'+1;
}
char z(int f){
return 'a'+f-1;
}
void ins(string s){
int p=1,t;
for(int i=0;i<s.size();i++){
t=ord(s[i]);
if(tree[p][t]==0){
tree[p][t]=++tot;
}
p=tree[p][t];
}
num[p]++;
return ;
}
bool query(){
int p=1,t;
for(int i=0;i<q.size();i++){
t=ord(q[i]);
p=tree[p][t];
if(p==0){
return 0;
}
}
return num[p];
}
void del(int p,int r,int k){
if(r>=q.size()){
if(!vis[p]) e+=num[p];
vis[p]=1;
return ;
}
if(p==0){
return ;
}
int t=ord(q[r]);
if(k==0){
del(tree[p][t],r+2,k+1);
}
del(tree[p][t],r+1,k);
return ;
}
void fill(int p,int r,int k){
if(r>=q.size()){
if(k==0){
for(int i=1;i<=26;i++){
if(!vis[tree[p][i]]) e+=num[tree[p][i]];
vis[tree[p][i]]=1;
}
}else{
if(!vis[p]) e+=num[p];
vis[p]=1;
}
return ;
}
if(p==0){
return ;
}
int t=ord(q[r]);
if(k==0){
for(int i=1;i<=26;i++){
fill(tree[tree[p][i]][t],r+1,k+1);
}
}
fill(tree[p][t],r+1,k);
return ;
}
void change(int p,int r,int k){
if(r>=q.size()){
if(!vis[p]) e+=num[p];
vis[p]=1;
return ;
}
if(p==0){
return ;
}
int t=ord(q[r]);
if(k==0){
for(int i=1;i<=26;i++){
if(r+1<=q.size()-1){
int _t=ord(q[r+1]);
change(tree[tree[p][i]][_t],r+2,k+1);
}else{
if(i!=ord(q[q.size()-1])){
e+=num[tree[p][i]];
}
}
}
}
change(tree[p][t],r+1,k);
return ;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
ins(w[i]);
}
while(m--){
cin>>q;
if(query()){
cout<<-1<<'\n';
continue;
}else{
del(1,0,0);
fill(1,0,0);a
change(1,0,0);
cout<<e<<'\n';
e=0;
}
}
return 0;
}