【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
【BZOJ2084】[Poi2010]Antisymmetry(manarcher)
题面
题解
一眼马拉车吧。。。明显就是在回文串的基础上随便改了改。
似乎还可以魔改回文树,然而我这智商可能魔改不出来。
稍微注意一下因为长度只能是偶数,所以不是加进来的字符的位置是不能用来更新的。
#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 500500
int n;char s[MAX<<1];
int p[MAX<<1],mx,id;
long long ans;
int main()
{
scanf("%d",&n);scanf("%s",s+1);
for(int i=n;i;--i)s[i+i]=s[i],s[i+i+1]='#';
s[1]='-';s[0]=s[2];s[n+n+1]=s[n+n-1];
for(int i=1;i<=n+n+1;i+=2)
{
p[i]=mx>i?min(p[id*2-i],mx-i):1;
while((s[i+p[i]]=='#'&&s[i-p[i]]=='#')||(s[i+p[i]]^s[i-p[i]])==1)++p[i];
if(i+p[i]>mx)mx=i+p[i],id=i;
}
for(int i=3;i<n+n;i+=2)ans+=p[i]/2;
cout<<ans<<endl;
return 0;
}