没有判重也过了,还是应该判重一下的。
代码
#include<bits/stdc++.h>
#define maxn 20010
#define maxsize 26
using namespace std;
int ans;
int sum[maxn];
map<string,int>MAP;
///////////////////////////////////////
//字典树
int ch[maxn][maxsize];
int val[maxn],sz;
void init()
{
memset(ch[0],0,sizeof(ch[0]));
val[0]=0;
sz=1;
}
int idx(char c)
{
return c-'a';
}
void insert(char* s,int v)
{
int l=strlen(s);
int j=0;
for(int i=0;i<l;i++)
{
int id=idx(s[i]);
if(!ch[j][id])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[j][id]=sz++;
}
j=ch[j][id];
}
val[j]=v;
}
///////////////////////////////////////////////
///////////////////////////////////////////////
//Aho-Corasick自动机
int f[maxn],last[maxn];
void getfail()
{
queue<int>q;
f[0]=0;
for(int i=0;i<maxsize;i++)
{
int u=ch[0][i];
if(u)
{
f[u]=last[u]=0;
q.push(u);
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int i=0;i<maxsize;i++)
{
int u=ch[r][i];
if(!u){ch[r][i]=ch[f[r]][i];continue;}
q.push(u);
int v=f[r];
while(v&&!ch[v][i]) v=f[v];
f[u]=ch[v][i];
last[u]=val[f[u]]?f[u]:last[f[u]];
}
}
}
void add(int j)
{
if(j)
{
sum[val[j]]++;
ans=max(ans,sum[val[j]]);
add(last[j]);
}
}
void find(char* s)
{
int l=strlen(s);
int j=0;
for(int i=0;i<l;i++)
{
int id=idx(s[i]);
j=ch[j][id];
if(val[j]) add(j);
add(last[j]);
}
}
//////////////////////////////
int n;
char s[200][100];
char str[1000010];
int main()
{
while(scanf("%d",&n)==1&&n)
{
MAP.clear();
init();
ans=0;
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++)
{
scanf("%s",s[i]);
insert(s[i],i);
MAP[string(s[i])]=i;
}
getfail();
scanf("%s",str);
find(str);
printf("%d\n",ans);
for(int i=1;i<=n;i++)
if(sum[MAP[string(s[i])]]==ans)
printf("%s\n",s[i]);
}
return 0;
}