代码如下
#include<bits/stdc++.h>
#define ll long long
#define N 1000010
using namespace std;
char s1[80],s2[N];
int son[20000][30],idx,cnt[20000],ne[20000],ans[20000],maxn;
string s3[20000];
void insert()
{
int p=0;
for(int j=0;j<strlen(s1);j++)
{
int k=s1[j]-'a';
if(!son[p][k])son[p][k]=++idx;
p=son[p][k];
}
cnt[p]++;
s3[p]=s1;
}
void build()
{
queue < int > q;
for(int i=0;i<26;i++)
{
if(son[0][i])q.push(son[0][i]);
}
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=0;i<26;i++)
{
int v=son[u][i];
if(v){ne[v]=son[ne[u]][i];q.push(v);}
else son[u][i]=son[ne[u]][i];
}
}
}
void query(char *s)
{
int i=0;
for(int k=0;s[k];k++)
{
int i=son[i][s[k]-'a'];
for(int j=i;j;j=ne[j])
{
ans[j]+=cnt[j];
}
}
}
void out()
{
maxn=0;
for(int i=0;i<=idx;i++)
{
if(maxn<ans[i])maxn=ans[i];
}
printf("%d\n",maxn);
for(int i=0;i<=idx;i++)
{
if(maxn==ans[i])cout<<s3[i]<<endl;
}
}
void reset()
{
memset(s1,0,sizeof s1);
memset(s2,0,sizeof s2);
memset(son,0,sizeof(son));
memset(cnt,0,sizeof(cnt));
memset(ne,0,sizeof(ne));
memset(ans,0,sizeof(ans));
idx=0;
}
int main()
{
int n;
scanf("%d",&n);
while(n)
{
for(int i=1;i<=n;i++)
{
cin>>s1;
insert();
}
build();
cin>>s2;
query(s2);
out();
reset();
cin>>n;
}
}
第十一的测试点显示我的代码输出了错误的答案
但是下载测试点后本地运行的结果是对的
是评测出错了?希望官方检查检查毕竟是道蓝题