【BZOJ2084】[Poi2010]Antisymmetry(manarcher)

【BZOJ2084】[Poi2010]Antisymmetry(manarcher)

题面

BZOJ
洛谷

题解

一眼马拉车吧。。。明显就是在回文串的基础上随便改了改。
似乎还可以魔改回文树,然而我这智商可能魔改不出来。
稍微注意一下因为长度只能是偶数,所以不是加进来的字符的位置是不能用来更新的。

#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;
}
posted @ 2018-09-29 10:59  小蒟蒻yyb  阅读(379)  评论(0编辑  收藏  举报