WA 70,用 Trie 树做的。
#include<bits/stdc++.h>
using namespace std;
int n,q,sn[200005][26],cnt[200005],sum;
char s[25];
unordered_map<int,bool>mp;
int query(){
int cur=0;
for(int i=1;s[i];i++){
if(!sn[cur][s[i]-'a'])return 0;
cur=sn[cur][s[i]-'a'];
}
int x=(mp[cur]?0:cnt[cur]);
mp[cur]=true;
return x;
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%s",s);
int cur=0;
for(int i=0;s[i];i++){
if(!sn[cur][s[i]-'a'])sn[cur][s[i]-'a']=++sum;
cur=sn[cur][s[i]-'a'];
}
cnt[cur]++;
}
while(q--){
mp.clear();
for(int i=0;i<20;i++)s[i]=0;
scanf("%s",s+1);
if(query()){
puts("-1");
continue;
}
n=strlen(s+1);
char c=s[1];
int ans=0;
for(int i=1;i<=n;s[i]=c,i++,c=s[i])for(char j='a';j<='z';j++)s[i]=j,ans+=query();
c=0;
for(int i=n;i;i--)swap(s[i],c),ans+=query();
for(int i=1;i<=n;i++)swap(c,s[i]);
for(c='a';c<='z';c++){
s[n+1]=c;
for(int i=n;i;i--)ans+=query(),swap(s[i],s[i+1]);
ans+=query();
for(int i=1;i<=n;i++)swap(s[i],s[i+1]);
}
printf("%d\n",ans);
}
return 0;
}