manacher好题
直接套一个manacher就好了
首先可以肯定,满足题意的串都是偶长度的,因为若是奇长度,那么中间位置必然和原串相反
还有就是匹配的时候要用0和1匹配,#和#匹配
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int M=5005000;
int jlc[M*2]={0};
char s1[M*2],s[M*2],to[500];
void junerlache(int len)
{
to['0']='1';to['1']='0';
to['#']='#';to['@']='@';
int mks=0,poi=0;lli ans=0;
for (int i=0;i<len;i+=2)//只能是偶数长度的串
{
if (mks>i) jlc[i]=min(mks-i,jlc[2*poi-i]);
else jlc[i]=1;
while (s[i-jlc[i]]==to[s[i+jlc[i]]]) jlc[i]++;
if (jlc[i]+i>mks) mks=i+jlc[i],poi=i;
ans+=jlc[i]>>1;
}
cout<<ans;
return ;
}
signed main()
{
int n;cin>>n;
scanf("%s",s1);
int len=strlen(s1);
for (int i=0;i<len;i++)
s[i*2]='#',s[i*2+1]=s1[i];
s[len*2]='#';s[len*2+1]='@';
junerlache(strlen(s));
return 0;
}