萌新求助,#24WA
  • 板块CF17E Palisection
  • 楼主fzhfzh
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/2/22 21:13
  • 上次更新2023/11/5 02:51:54
查看原帖
萌新求助,#24WA
158050
fzhfzh楼主2021/2/22 21:13

RT

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,d[4000005],g[4000005],f[4000005],p,maxr,M,mod=51123987,ans;
string s,a;
void maracher(){
	for(int i=1;i<s.length();i++)d[i]=1;
	p=maxr=0;
	for(int i=2;i<s.length();i++){
		if(i<=maxr)d[i]=min(d[maxr+p-i],maxr-i+1);
		while((i+d[i]<s.length())&&(i-d[i]>=1)&&(s[i+d[i]]==s[i-d[i]]))d[i]++;
		if(i+d[i]-1>maxr){
			maxr=i+d[i]-1;
			p=i-d[i]+1;
		} 
	}
}
int main(){
	cin>>n>>a;
	s=' ';
	for(int i=0;i<n;i++){
		s+='#',s+=a[i];
	}
	s+='#';
	maracher();
	//cout<<s<<endl;
//	for(int i=1;i<s.length();i++){
//		cout<<d[i]<<' ';
//	}
	for(int i=1;i<s.length();i++){
		if(d[i]>=2){
			M+=d[i]/2;
			M=M%mod;
		}
	}
	M=(M*(M-1)/2)%mod;
//	cout<<endl<<M<<endl;
	for(int i=1;i<s.length();i++){
		f[i-d[i]+1]++,f[i+1]--;
		g[i]++,g[i+d[i]]--;
	} 
//	for(int i=1;i<s.length();i++)cout<<f[i]<<' ';
//	cout<<endl;
//	for(int i=1;i<s.length();i++)cout<<g[i]<<' ';
//	cout<<endl;
	for(int i=1;i<s.length();i++){
		f[i]=(f[i-1]+f[i])%mod;
		g[i]=(g[i-1]+g[i])%mod;
		//cout<<f[i]<<' '<<g[i]<<endl;
	}
//	for(int i=1;i<s.length();i++)cout<<f[i]<<' ';
//	cout<<endl;
//	for(int i=1;i<s.length();i++)cout<<g[i]<<' ';
//	cout<<endl;
	for(int i=2;i<s.length();i+=2){
		g[i]=(g[i]+g[i-2])%mod;
	}
//	for(int i=2;i<s.length();i+=2)cout<<g[i]<<' ';
	for(int i=2;i<s.length();i+=2){
		ans=(ans+f[i]*g[i-2])%mod;
	}
	cout<<(M-ans+mod+mod)%mod;
	return 0;
}
2021/2/22 21:13
加载中...