BZOJ2084&&洛谷P3501 [POI2010]ANT-Antisymmetry

manache好题

直接套一个manacher就好了

代码

//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;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81699119