求哪位大佬看一下 本地跑没事但评测时却输出-1。
查看原帖
求哪位大佬看一下 本地跑没事但评测时却输出-1。
56457
yinajiking楼主2021/2/26 12:00
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<algorithm>
#define MAXN 1000000
#define mod 19930726ll
using namespace std;
typedef long long ll;
int p[2*MAXN+100],pl,len[2*MAXN+100];

string readin()
{
	char cc;
	cc=getchar();
	if (cc=='\n')cc=getchar(); 
	string str="$";
	while (cc!='\n'){
		str+='#';str+=cc;
		cc=getchar();
	}
	str+="#";
	return str;
}

ll fpow(ll arg,int time)
{
	ll ans=1;
	while (time>0){
		if (time&1)ans=ans*arg%mod;
		arg=(arg*arg)%mod;
		time>>=1;
	}
	return ans;
}

int main()
{
	string s1;
	int n,i,id,mx;
	ll k;
	cin>>n>>k;
	s1=readin();
	len[0]=0;
	mx=0;id=0;
	pl=0;
	for (i=1;i<s1.size();i++){
		
		if (i<mx)len[i]=min(mx-i,len[2*id-i]);
			else len[i]=1;
		while (s1[i-len[i]]==s1[i+len[i]])len[i]++;
		if (i+len[i]>mx){id=i,mx=i+len[i];}
		if (s1[i]!='#')p[++pl]=len[i]-1;
	}
	
	sort(p+1,p+pl+1);
	ll sum=0,ans=1;
	int last=p[pl];p[0]=0;
	for (i=pl;i>=0&&sum<k;i--){
		while (last>p[i]){
			int length=pl-i;
			if (length+sum>k)length=k-sum;
			ans=ans*fpow(last,length)%mod;
			last-=2;
			sum+=length;
			if (sum==k)break;
		}
	}
	if (sum<k)cout<<-1<<"\n";
		else cout<<ans<<"\n";
	return 0;
}

P1659 https://www.luogu.com.cn/problem/P1659

2021/2/26 12:00
加载中...