1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include<bits/stdc++.h> #define maxn 1000007 using namespace std; int T,n,ans; char mod[maxn][100],tx[maxn];
namespace AC{ int tr[maxn][27],fail[maxn],tot; int cnt,val[maxn],num[maxn]; void Init(){ memset(tr,0,sizeof(tr)); memset(num,0,sizeof(num)); memset(fail,0,sizeof fail); memset(val,0,sizeof val); cnt=ans=0; } void insert(char *s,int id){ int now=0; for(int i=0;s[i];i++){ if(!tr[now][s[i]-'a']) tr[now][s[i]-'a']=++cnt; now=tr[now][s[i]-'a']; } val[now]=id; } queue<int >q; void build(){ for(int i=0;i<26;i++) if(tr[0][i]) q.push(tr[0][i]); while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<26;i++) if(tr[u][i]) fail[tr[u][i]]=tr[fail[u]][i],q.push(tr[u][i]),cerr<<fail[tr[u][i]]<<endl; else tr[u][i]=tr[fail[u]][i]; } } void query(char *t){ int u=0; for(int i=0;t[i];i++){ u=tr[u][t[i]-'a']; for(int j=u;j;j=fail[j]) if(val[j]) num[val[j]]++,ans=max(ans,num[val[j]]); } printf("%d\n",ans); for(int i=1;i<=n;i++) if(ans==num[i]) printf("%s\n",mod[i]); } }
int main(){ scanf("%d",&n); while(n){ AC::Init(); for(int i=1;i<=n;i++) scanf("%s",mod[i]),AC::insert(mod[i],i); AC::build(); scanf("%s",tx); AC::query(tx); scanf("%d",&n); } }
|