马拉车+快速幂 TLE on #19~#21 求助
查看原帖
马拉车+快速幂 TLE on #19~#21 求助
609818
Point_LUO楼主2024/7/14 11:45
#include<bits/stdc++.h>
using namespace std;
const int Mod=19930726,N=1000001;
char a[N];
int n,r[N],cnt[N],ans=1;
long long k,tot;
bool cmp(int a,int b){ return a>b; }
long long Pow(int x,int y)//快速幂
{
	long long tmp=x,res=1;
	while(y){
		if(y&1){
			res=res*tmp%Mod;
		}
		y>>=1;
		tmp=tmp*tmp%Mod; 
	}
	return res;
}
int main()
{
	cin>>n>>k;
	scanf(" %s",a+1);
    //manacher求奇数长度回文,不插入字符
	int pos=0;
	r[1]=1;
	for(int i=1;i<=n;i++)
	{
		int rpos=pos+r[pos]-1;
		int iipos=pos-i;
		if(i<=rpos) r[i]=min(r[iipos],rpos-i+1);
		else r[i]=1;
		while(i-r[i]>0&&i+r[i]<=n&&a[i-r[i]]==a[i+r[i]]) r[i]++;
		if(i+r[i]-1>rpos) pos=i;
	}
	for(int i=1;i<=n;i++)  cnt[r[i]]++;
	for(int i=(n+1)>>1;i>=1;i--)
	{
		cnt[i]+=cnt[i+1];
		if(tot+cnt[i]<k)
		{
			ans=(ans*Pow((i<<1)-1,cnt[i]))%Mod;
			tot+=cnt[i];
		}
		else
		{
			ans=(ans*Pow((i<<1)-1,k-tot))%Mod;
			tot=k;
			break;
		}
	}
    
	if(tot<k) cout<<-1<<endl;
	else cout<<ans<<endl;
	return 0;
}
2024/7/14 11:45
加载中...