https://www.luogu.org/problemnew/show/P3796
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+4; int tot=0,sum[maxn]; struct node{ int fail,next[26],tag,end; }z[maxn]; inline void insert(char *s,int m){ int len=strlen(s); int now=0; for(int i=0;i<len;i++){ int v=s[i]-'a'; if(!z[now].next[v]) z[now].next[v]=++tot; now=z[now].next[v]; } //z[now].tag++; z[now].end=m; } inline void build_AC(){ queue<int>q; for(int i=0;i<26;i++) { z[z[0].next[i]].fail=0; if(z[0].next[i]) q.push(z[0].next[i]); } while(!q.empty()){ int now=q.front();q.pop(); for(int i=0;i<26;i++){ if(z[now].next[i]){ z[z[now].next[i]].fail=z[z[now].fail].next[i]; q.push(z[now].next[i]); }else{ z[now].next[i]=z[z[now].fail].next[i]; } } } } inline void AC_query(char *s){ int len=strlen(s); int now=0; for(int i=0;i<len;i++){ now=z[now].next[s[i]-'a']; int t=now; while(t){ sum[z[t].end]++; t=z[t].fail; } } } char s[maxn]; char st[154][74]; int main(){ int n; while(cin>>n){ tot=0; memset(z,0,sizeof(z)); memset(sum,0,sizeof(sum)); if(n==0) return 0; for(int i=1;i<=n;i++){ scanf("%s",st[i]); insert(st[i],i); } build_AC(); scanf("%s",s); AC_query(s); int ans=0; for(int i=1;i<=n;i++) ans=max(ans,sum[i]); printf("%d ",ans); for(int i=1;i<=n;i++){ if(sum[i]==ans) printf("%s ",st[i]); } } }