#include <iostream>
#include<bits/stdc++.h>
#define M 1000100
using namespace std;
int i,n,x,v,u,w,len,tot,c[M],e[M],f[M][27],ans[M],fail[M];
queue<int> Q;char s[M],a[155][75];
void clear(queue<int>& q) {queue<int> empty;swap(empty,q);}
void ins(char *s,int I){
len=strlen(s+1);v=1;
for (int i=1;i<=len;i++){
u=s[i]-97;
if (!f[v][u]) f[v][u]=++tot;
v=f[v][u];
}
e[v]=I;
}
void bfs(){
for (i=0;i<26;i++)
if (f[1][i])
fail[f[1][i]]=1,Q.push(f[1][i]);
while (!Q.empty()){
u=Q.front();Q.pop();
for (i=0;i<26;i++){
v=f[u][i];
if (v) Q.push(v),fail[v]=f[fail[u]][i]?f[fail[u]][i]:1;
else f[u][i]=f[fail[u]][i];
}
}
}
void find(char *s){
len=strlen(s+1);v=1;
for (i=1;i<=len;i++){
u=s[i]-97; w=f[v][u];
while (w){
if (e[w]) ans[e[w]]++;
w=fail[w];
}
v=f[v][u];
}
}
int main(){
scanf("%d",&n);
while (n){
memset(e,0,sizeof(e));memset(f,0,sizeof(f));clear(Q);tot=1;
memset(ans,0,sizeof(ans));memset(fail,0,sizeof(fail));
for (i=1;i<=n;i++)
scanf("%s",a[i]+1),ins(a[i],i);
bfs(); scanf("%s",s+1); find(s);
for (i=1,x=0;i<=n;i++)
if (ans[i]>ans[x]) x=i;
printf("%d\n",ans[x]);
for (i=1;i<=n;i++)
if (ans[i]==ans[x])
printf("%s\n",a[i]+1);
scanf("%d",&n);
}
return 0;
}
【模板】AC自动机(简单版)这题对了,然后在原代码的基础上编这题。调了2个小时都没对,求大佬帮助