#include <bits/stdc++.h>
using namespace std;
const int maxl=1e6+10;
const int maxn=160;
const int maxm=80;
int n;
char T[maxl],S[maxn][maxm];
struct node{
node * son[26],* fail;
int id;
node(){
for(int i=0;i<26;i++) son[i]=NULL;
fail=NULL;
id=0;
}
};
node * root;
void build(int id){
node * p=root;
int len=strlen(S[id]);
for(int i=0;i<len;i++){
if(!p->son[S[id][i]-'a']) p->son[S[id][i]-'a']=new node();
p=p->son[S[id][i]-'a'];
}
p->id=id;
}
queue <node *> Q;
void init(){
Q.push(root);
while(!Q.empty()){
node * u=Q.front(); Q.pop();
for(int i=0;i<26;i++)
if(u->son[i]){
if(u==root) u->son[i]->fail=root;
else{
node * p=u->fail;
while(p){
if(p->son[i]){u->son[i]->fail=p->son[i]; break;}
p=p->fail;
}
if(!p) u->son[i]->fail=root;
}
Q.push(u->son[i]);
}
}
}
int cnt[maxn],ans;
bool cmp(int a,int b){return cnt[a]!=cnt[b]?cnt[a]>cnt[b]:a<b;}
void solve(){
int len=strlen(T);
memset(cnt,0,sizeof(cnt));
node * p=root;
for(int i=0;i<len;i++){
while(!p->son[T[i]-'a']&&p!=root) p=p->fail;
p=p->son[T[i]-'a'];
if(!p) p=root;
node * tmp=p;
while(tmp) ++cnt[tmp->id],tmp=tmp->fail;
}
ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,cnt[i]);
printf("%d\n",ans);
for(int i=1;i<=n;i++)
if(cnt[i]==ans) printf("%s\n",S[i]);
}
int main(){
while(1){
scanf("%d",&n);
if(n==0) break;
root=new node();
for(int i=1;i<=n;i++){
scanf("%s",S[i]);
build(i);
}
init();
scanf("%s",T);
solve();
}
return 0;
}
洛谷 P3796 【模板】AC自动机(加强版)
最新推荐文章于 2022-11-09 05:17:46 发布