```
#include<bits/stdc++.h>
#define add_SUU ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
#define int long long
#define x first
#define y second
#define inf 0x3f3f3f3f3f3f3f3f
#define iter set<pii>::iterator
using namespace std;
typedef pair<int,int> pii;
const int maxn=5e4+34;
int MOD=1e9+7;
int tot,cnt,idx;
int trie[maxn][27];
//int cntWord[maxn];
int fail[maxn];
int MAX,tim[maxn],No[maxn];
//vector<int>vis(maxn);
//vector<vector<int>>str(maxn);
void insert(string s,int id){
int root=0;
for(char ch:s){
int nex=ch-'a'+1;
if(!trie[root][nex])trie[root][nex]=++tot;
root=trie[root][nex];
}
No[root]=id;
}
void get_fail(){
queue<int>que;
for(int i=1;i<=26;i++){
if(trie[0][i]){
fail[trie[0][i]]=0;
que.push(trie[0][i]);
}
}
while(que.size()){
int u=que.front();
que.pop();
for(int i=1;i<=26;i++){
if(trie[u][i]){
fail[trie[u][i]]=trie[fail[u]][i];
que.push(trie[u][i]);
}
else trie[u][i]=trie[fail[u]][i];
}
}
}
void ask(string s){
int now=0;
for(char ch:s){
now=trie[now][ch-'a'+1];
for(int i=now;i;i=fail[i])tim[No[i]]++;
}
}
string ss[300];
void work(int n){
// int n,m,k;
// cin>>n;
memset(No,0,sizeof(No));
memset(tim,0,sizeof(tim));
memset(trie,0,sizeof(trie));
memset(fail,0,sizeof(fail));
for(int i=1;i<=n;i++){
tim[i]=0;
cin>>ss[i];
insert(ss[i],i);
}
get_fail();
string s;
cin>>s;
ask(s);
for(int i=1;i<=n;i++)MAX=max(MAX,tim[i]);
cout<<MAX<<'\n';
for(int i=1;i<=n;i++){
if(tim[i]<MAX)continue;
cout<<ss[i]<<'\n';
}
// for(int i=1;i<=tot;i++){
// fail[i]=0;
// No[i]=0;
// for(int j=1;j<=26;j++)trie[i][j]=0;
// }
MAX=idx=tot=0;
}
signed main()
{
// add_SUU;
int t=1;
// cin>>t;
// while(t--)
int n;
cin>>n;
while(n){
work(n);
cin>>n;
}
return 0;
}
by DaShabby @ 2023-08-29 22:23:18