题面传送门
题解
随便统计一下每个单词出现的次数
详见代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int n,size,pos[155];
struct node{
int fail,lk[26],sum;
bool mark;
}ac[11000];
char s[155][75],ss[1000010];
inline void insert(char *s,int id){
int len=strlen(s+1),nw=0;
for(int i=1,t;i<=len;++i){
t=s[i]-'a';
if(ac[nw].lk[t]) nw=ac[nw].lk[t];
else{
ac[nw].lk[t]=++size;
nw=ac[nw].lk[t];
}
}
ac[nw].mark=1;
pos[id]=nw;
return;
}
inline void build(){
queue<int>q;
for(int i=0;i<26;++i)
if(ac[0].lk[i]) q.push(ac[0].lk[i]);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=0;i<26;++i)
if(ac[x].lk[i]){
ac[ac[x].lk[i]].fail=ac[ac[x].fail].lk[i];
q.push(ac[x].lk[i]);
}
else ac[x].lk[i]=ac[ac[x].fail].lk[i];
}
return;
}
inline int solve(char *s){
int len=strlen(s+1),nw=0,mxn=0;
for(int i=1;i<=len;++i){
nw=ac[nw].lk[s[i]-'a'];
int nxt=nw;
while(nxt){
if(ac[nxt].mark){
++ac[nxt].sum;
mxn=max(mxn,ac[nxt].sum);
}
nxt=ac[nxt].fail;
}
}
return mxn;
}
int main(){
scanf("%d",&n);
while(n){
memset(ac,0,sizeof(ac));
size=0;
for(int i=1;i<=n;++i){
scanf("%s",s[i]+1);
insert(s[i],i);
}
build();
scanf("%s",ss+1);
int tmp;
printf("%d\n",tmp=solve(ss));
for(int i=1;i<=n;++i)
if(ac[pos[i]].sum==tmp) printf("%s\n",s[i]+1);
scanf("%d",&n);
}
return 0;
}