欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

1462:Antisymmetry

时间:2024-06-15 22:43 作者:admin 点击:
#include bits/stdc++.h#define B 3#define ULL unsigned long long#define maxn 500010using namespace std;char s[maxn];int a[maxn],b[maxn],N;ULL ah[maxn],bh[maxn],n[maxn],cnt=0;int judge(int pos,int d){//pos字串中空位置,d距离中空的字符
#include <bits/stdc++.h>
#define B 3
#define ULL unsigned long long
#define maxn 500010
using namespace std;
char s[maxn];
int a[maxn],b[maxn],N;
ULL ah[maxn],bh[maxn],n[maxn],cnt=0;
int judge(int pos,int d){//pos字串中空位置,d距离中空的字符数量 
	int xa,ya,xb,yb;
	xa=pos-d+1,ya=pos+d;
	xb=N-(ya-1),yb=N-(xa-1);
	if(ah[ya]-ah[xa-1]*n[ya-(xa-1)]==bh[yb]-bh[xb-1]*n[yb-(xb-1)])return 1;//1表示找到取反对称串 
	else return 0;
} 
int bisection(int pos){
	int l,r,mid;
	l=1,r=min(pos,N-pos);
	while(l<=r){//此处写成l<r也折腾了会 
		mid=(l+r)/2;
		if(judge(pos,mid))l=mid+1;//好久没写二分了,此处写成l=mid;耽搁了些时间 
		else r=mid-1;
	}
	return l-1;
} 
int main(){
	int i,j,len,xa,ya,xb,yb;
	scanf("%d%s",&N,s+1);
	for(i=1;i<=N;i++){
		a[i]=s[i]-'0';//顺序字串 
		b[N-i+1]=!a[i];//取反反转字串,b[N-i+1]=1-a[i];也可 
	}
	n[0]=1;
	for(i=1;i<=N;i++)n[i]=n[i-1]*B;
	ah[0]=0,bh[0]=0;
	for(i=1;i<=N;i++){
		ah[i]=ah[i-1]*B+a[i]+1;
		bh[i]=bh[i-1]*B+b[i]+1;
	}
	for(i=1;i<N;i++)cnt+=bisection(i);
	printf("%llu\n",cnt);
	return 0;
}


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%