#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) |