挺水的一道题,manacher匹配的时候改一下匹配条件就可以了,只要两个数相加等于一时就可以,结果WA了三次,一定要注意是不存在奇数串的,而且统计的时候要用long long,还有一次是忘了除以二。。。
还是太弱了
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 1000010
using namespace std;
char s[maxn],a[2*maxn];
int p[2*maxn];
int n,m;
long long ans;
void manacher()
{
m=2*n+1;
for (int i=1;i<=n;i++)
{
a[i*2]=s[i];a[i*2+1]='#';
}
a[0]='+';a[1]='#';a[m+1]='-';
int mx=0,id=0;
for (int i=1;i<=m;i+=2)
{
if (mx>i) p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while (a[i+p[i]]-'0'+a[i-p[i]]-'0'==1 || (a[i+p[i]]==a[i-p[i]] && a[i+p[i]]=='#')) p[i]++;
if (i+p[i]>mx) mx=i+p[i],id=i;
}
}
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
manacher();
for (int i=1;i<=m;i+=2) ans+=(p[i]-1)/2;
printf("%lld\n",ans);
return 0;
}