p3501 RE求调
  • 板块题目总版
  • 楼主hhklxq
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/16 10:03
  • 上次更新2023/11/3 03:27:35
查看原帖
p3501 RE求调
690631
hhklxq楼主2023/8/16 10:03
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll pp=131,ans,p[1000010],hl[1000010],hr[1000010],n;
string s,t;
void find(ll x){
	ll l=0,r=min(x,n-x);
	while(l<r){
		ll mid=(l+r+1)>>1;
		if(hl[x]-hl[x-mid]*p[mid]==hr[x+1]-hr[x+1+mid]*p[mid]){
			l=mid;
		}else{
			r=mid-1;
		}
	}
	ans+=l;
}
void read(){
	cin>>n>>s;
	p[0]=1;
	for(ll i=0;i<n;++i){
		s[i]=='1'?t[i]='0':t[i]='1';
	}
	for(ll i=1;i<=n;++i)p[i]=p[i-1]*pp;
	for(ll i=1;i<=n;++i)hl[i]=hl[i-1]*pp+s[i-1];
	for(ll i=n;i>=1;--i)hr[i]=hr[i+1]*pp+t[i-1];
	for(ll i=1;i<n;++i){
		find(i);
	}
}
int main(){
	read();
	printf("%lld",ans);
	return 0;
}
2023/8/16 10:03
加载中...