HYSBZ - 2342 双倍回文 马拉车算法

题目链接:点击查看

题意:找一个回文串,他的一半也是回文串,并且长度是4的倍数

题解:马拉车算法跑一遍,记录每一个r[i]值,在判断左半部分的是否符合条件,负责度?

#include<bits/stdc++.h>
using namespace std;
const int N=500100;
char s[N],str[N*2];
int n,r[N*2];
int main()
{
	while(~scanf("%d",&n))
	{
		scanf("%s",s);
		int len=strlen(s);
		str[0]='+';
		str[1]='#';
		for(int i=0;i<len;i++)
		{
			str[i*2+2]=s[i];
			str[i*2+3]='#';
		}
		str[len*2+2]='-';
		len=len*2+2;
		int maxx=0,ans=0,id;
		int cnt;
		for(int i=2;i<len;i++)
		{
			r[i]=maxx>i?min(r[id-(i-id)],maxx-i):1;
			while(str[i+r[i]]==str[i-r[i]]) r[i]++;
			if(i+r[i]>maxx)
			{
				id=i;
				maxx=i+r[i];
			}
			cnt=r[i]-1;
			if(str[i] !='#') continue;
		//	cout<<str[i]<<" "<<cnt<<endl;
			while(cnt>ans)
			{
				if(cnt%4==0 && r[i-cnt/2]>cnt/2)
				{
					ans=cnt;
					break;
				}
				cnt-=2;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/88638485