代码如下
#include<bits/stdc++.h>
#define MAXN 20005
using namespace std;
int ch[MAXN][26],ne[MAXN],cnt[MAXN],idx;
int num[MAXN],ans;
struct word{
string name;
}index[MAXN];
void insert(string s){
int p=0;
for(int i=0;s[i];i++){
int j=s[i]-'a';
if(!ch[p][j]) ch[p][j]=++idx;
p=ch[p][j];
}
cnt[p]++;
index[p].name=s;
}
void build(){
queue<int> q;
for(int i=0;i<26;i++)
if(ch[0][i]) q.push(ch[0][i]);
while(q.size()){
int u=q.front();
q.pop();
for(int i=0;i<26;i++){
int v=ch[u][i];
if(v){
ne[v]=ch[ne[u]][i];
q.push(v);
}
else ch[u][i]=ch[ne[u]][i];
}
}
}
void search(string s){
for(int k=0,i=0;s[k];k++){
i=ch[i][s[k]-'a'];
for(int j=i;j;j=ne[j]){
if(cnt[j]) num[j]++;
if(num[j]>ans) ans=num[j];
}
}
}
void output(){
cout<<ans<<endl;
for(int i=0;i<MAXN;i++){
if(num[i]==ans) cout<<index[i].name<<endl;
}
}
void clear(){
memset(ch,0,sizeof(ch));
memset(ne,0,sizeof(ne));
memset(cnt,0,sizeof(cnt));
memset(num,0,sizeof(num));
idx=0;
ans=0;
for(int i=0;i<MAXN;++i) index[i].name.clear();
}
int main(){
while(1){
clear();
int N;
cin>>N;
cin.ignore();
if(!N) break;
for(int t=0;t<N;t++){
string s;
getline(cin,s);
insert(s);
}
build();
string s;
getline(cin,s);
search(s);
output();
}
return 0;
}