题解:
trie树+dfs乱搞出奇迹。。。。。。
#include<iostream> #include<cstring> #include<string> #include<cstdio> #define maxn 200010 using namespace std; int n,m,ans,len,top,tot; int fail[maxn],sum[maxn],lis[maxn],son[maxn][26]; bool bo; bool vis[maxn]; char s[maxn]; void insert() { scanf("%s",s+1); int p=0; for (int i=1; s[i]; p=son[p][s[i]-'a'],i++) if (!son[p][s[i]-'a']) son[p][s[i]-'a']=++tot; sum[p]=1; } void dfs(int x,int y, int z) { if (x==len && sum[y] && !z) {bo=false; return; } if (x==len && sum[y] && z) { if (!vis[y]) {vis[y]=1; lis[++top]=y; ans++;}return;} if (x<len && !z) dfs(x+1,y,1);//加单词 if (!z) { for (int i=0; i<26; i++) if (son[y][i]) { dfs(x,son[y][i],1); if (i!=s[x+1]-'a') dfs(x+1,son[y][i],1);} } //if (x==len) return ; if (son[y][s[x+1]-'a']) dfs(x+1,son[y][s[x+1]-'a'],z); } void work() { while (top) vis[lis[top--]]=0; scanf("%s",s+1); len=strlen(s+1); ans=0; bo=true; dfs(0,0,0); if (bo==false) printf("-1\n"); else printf("%d\n",ans); } int main() { cin>>n>>m; top=tot=0; memset(vis,false,sizeof(vis)); for (int i=1; i<=n; i++) insert(); for (int i=1; i<=m; i++) work(); } View Code