反对称子串,emmm,其实本质上和回文子串是一样的,只是对应方法不一样罢了。然后就可以直接上 马拉车(manacher)了。
#include<bits/stdc++.h>
#define N 1000000
using namespace std;
char s[N+5],tmp[2*N+5];
int p[2*N+5];
int n,m;
long long ans;
inline void manacher()
{
m=2*n+1;
for (int i=1;i<=n;i++)tmp[i*2]=s[i],tmp[i*2+1]='#';
tmp[0]='+';tmp[1]='#';tmp[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 (tmp[i+p[i]]-'0'+tmp[i-p[i]]-'0'==1 || (tmp[i+p[i]]==tmp[i-p[i]] && tmp[i+p[i]]=='#')) p[i]++;
if (i+p[i]>mx) mx=i+p[i],id=i;
}
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d\n",&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;
}
值得说的是,要把字符串处理一下,头尾各加一个不同字符,中间插一样的特殊字符(处理偶数)。