题目
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=2e4;
int tr[N][26],pos[N],fail[N],tot,T,n;
char a[N/100][N/100],s[N*201];
vector<int> endpos[N];
struct node{int num,pos;}ans[N];
bool cmp(node x,node y){return x.num>y.num||x.num==y.num&&x.pos<y.pos;}
inline void read(char *a){scanf("%s",a+1);n=strlen(a+1);}
void init(){
memset(tr,0,sizeof(tr));
memset(ans,0,sizeof(ans));
memset(fail,0,sizeof(fail));
rep(i,0,N-1)endpos[i].clear();
rep(i,1,T)ans[i].pos=i;
tot=0;
}
void insert(int x,int pos,int id){
if(pos>n){endpos[x].push_back(id);return;}
int c=a[id][pos]-'a';
if(!tr[x][c])tr[x][c]=++tot;
insert(tr[x][c],pos+1,id);
}
void AC(){
queue<int> q;rep(i,0,25)if(tr[0][i])q.push(tr[0][i]);
while(q.size()){
int x=q.front();q.pop();
rep(i,0,25)if(tr[x][i]){
fail[tr[x][i]]=tr[fail[x]][i];
q.push(tr[x][i]);
}else tr[x][i]=tr[fail[x]][i];
}
}
void query(int x,int pos){
if(pos>n)return;
int c=s[pos]-'a',now=tr[x][c];
for(int t=now;t;t=fail[t]){
for(int i=0;i<endpos[t].size();i++)
ans[endpos[t][i]].num++;
}
query(tr[x][c],pos+1);
}
int main()
{
while(~scanf("%d",&T)&&T){
init();
rep(i,1,T)read(a[i]),insert(0,1,i);
AC(); read(s); query(0,1);
sort(ans+1,ans+T+1,cmp);
printf("%d\n",ans[1].num);
rep(i,1,T){
if(ans[i-1].num!=ans[i].num&&i!=1)break;
int len=strlen(a[ans[i].pos]+1);
rep(j,1,len)cout<<a[ans[i].pos][j];puts("");
}
}return 0;
}