p3796第十一的测试点评测结果有误
  • 板块工单反馈版
  • 楼主wangliu
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/4 13:11
  • 上次更新2024/5/4 15:20:13
查看原帖
p3796第十一的测试点评测结果有误
761920
wangliu楼主2024/5/4 13:11

题目链接

代码如下

#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;
	}
}

第十一的测试点显示我的代码输出了错误的答案

但是下载测试点后本地运行的结果是对的

是评测出错了?希望官方检查检查毕竟是道蓝题

2024/5/4 13:11
加载中...