```cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n;
string tmp[1000005];
char str[1000005];
int cnt,son[1000005][26],who[1000005];
int fail[1000005];
int tot[155];
inline void ins(int x)
{
int u=1;
int len=strlen(str+1);
for(int i=1;i<=n;i++)
{
int id=str[i]-'a';
if(son[u][id]==0)
{
son[u][id]=++cnt;
}
u=son[u][id];
}
who[u]=x;
}
inline void init()
{
for(int i=0;i<26;i++)
{
son[0][i]=1;
}
queue<int> q;
q.push(1);
fail[1]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
int fiu=fail[u];
for(int i=0;i<26;i++)
{
int v=son[u][i];
if(v!=0)
{
fail[v]=son[fiu][i];
q.push(v);
}
else
{
son[u][i]=son[fiu][i];
}
}
}
}
inline void slove()
{
int u=1;
int len=strlen(str+1);
for(int i=1;i<=len;i++)
{
int id=str[i]-'a';
int v=son[u][id];
while(v!=1)
{
if(who[v]!=0)
{
tot[who[v]]++;
}
v=fail[v];
}
u=son[u][id];
}
}
int main()
{
while(1)
{
scanf("%d",&n);
if(n==0)
{
break;
}
cnt=1;
memset(son,0,sizeof(son));
memset(who,0,sizeof(who));
memset(tot,0,sizeof(tot));
for(int i=1;i<=n;i++)
{
scanf("%s",str+1);
tmp[i]=str+1;
ins(i);
}
init();
scanf("%s",str+1);
slove();
int maxtime=0;
for(int i=1;i<=n;i++)
{
maxtime=max(maxtime,tot[i]);
}
printf("%d\n",maxtime);
for(int i=1;i<=n;i++)
{
if(tot[i]==maxtime)
{
printf("%s\n",tmp[i].c_str());
}
}
}
return 0;
}
```
by lovely_ckj @ 2021-11-17 12:37:17
BFS出问题了,私信我
by htssm @ 2021-11-17 13:34:32
@[lovely_ckj](/user/251130) 您这个BFS的时候要这样入队
```cpp
for(i=0;i<26;++i){
if(son[0][i]!=0){
fail[son[0][i]]=0;
q.push(son[0][i]);
}
}
```
by htssm @ 2021-11-17 13:35:52
我AC自动机的模板也调了很久。。。
by htssm @ 2021-11-17 13:36:39
@[htssm](/user/498526) 谢谢,刚刚回宿舍午休了/kk
by lovely_ckj @ 2021-11-17 14:07:18
。
by htssm @ 2021-11-17 14:36:01