manacher+快速幂 WA on #19~21 求调
查看原帖
manacher+快速幂 WA on #19~21 求调
575612
cs72703zyl楼主2024/8/15 10:16
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,mod=19930726;
long long n,k,maxn,p[N],ans=1;
map<long long,long long>	mp;
char a[N],s[N<<1];
void change(){
	s[0]='$';s[1]='#';
	long long w=2;
	for(long long i=1;i<=n;i++){
		s[w]=a[i];	w++;
		s[w]='#';	w++;
	}
	s[w]='&';	n=w;
}
void manacher(){
	long long R=0,C;
	for(long long i=1;i<n;i++){
		if(i<R)	p[i]=min(p[(C<<1)-i],p[C]+C-i);
		else	p[i]=1;
		while(s[i+p[i]]==s[i-p[i]])		p[i]++;
		if(p[i]+i>R){
			R=p[i]+i;
			C=i;
		}
		mp[p[i]-1]++;
		if((p[i]-1)%2)	maxn=max(maxn,p[i]-1);
	}
}
long long pw(long long a,long long b){
	long long res=1;
	while(b){
		if(b&1){
		    res=(res%mod*a%mod)%mod;
			res%=mod;
		}
		b=b>>1;
		a=((a%mod)*(a%mod))%mod;
	}
	return res%mod;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);	cout.tie(0);
	cin>>n>>k;
	cin>>(a+1);
	change();	manacher();
	while(k){
	    if(maxn<0){
	         cout<<-1<<endl;
	         return 0;
	    } 
		if(k<=mp[maxn]){
			ans=(ans%mod*pw(maxn,k)%mod)%mod;
			ans%=mod;
			cout<<ans<<endl;
			return 0;
		}else{
			ans=(ans%mod*pw(maxn,mp[maxn])%mod)%mod;
			ans%=mod;
			k-=mp[maxn];
			mp[maxn-2]+=mp[maxn];
			maxn-=2;
		}
	}
	return 0;
}
2024/8/15 10:16
加载中...