建出Trie树暴力扫一遍。
#include<bits/stdc++.h>
#define N 200100
using namespace std;
int s[N][26];
int cx[N],en[N];
char c[N];
int n,m,cnt,l;
void insert(int &p,int w){
if(!p) p=++cnt;
if(w==l){
en[p]=1;
return;
}
insert(s[p][c[w]-'a'],w+1);
}
bool query(int p,int w){
if(!p) return 0;
if(w==l) return en[p];
return query(s[p][c[w]-'a'],w+1);
}
void dfs(int p,int w,int f,int t){
if(!p) return;
if(w==l){
if(f){
cx[p]=t;
return;
}
for(int i=0;i<26;i++) dfs(s[p][i],w,1,t);
return;
}
dfs(s[p][c[w]-'a'],w+1,f,t);
if(!f){
for(int i=0;i<26;i++) dfs(s[p][i],w,1,t);
for(int i=0;i<26;i++) dfs(s[p][i],w+1,1,t);
dfs(p,w+1,1,t);
}
}
int main(){
scanf("%d%d",&n,&m);
cnt=1;
for(int i=0;i<n;i++){
scanf("%s",c);
l=strlen(c);
insert(s[1][c[0]-'a'],1);
}
for(int i=1;i<=m;i++){
scanf("%s",c);
l=strlen(c);
int ans=0;
if(query(1,0)) ans=-1;
if(ans==0){
dfs(1,0,0,i);
for(int j=1;j<=cnt;j++)
if(cx[j]==i&&en[j]) ans++;
}
printf("%d\n",ans);
}
return 0;
}