51nod 1089 马拉车算法

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089

回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。

输入一个字符串Str,输出Str里最长回文子串的长度。

Input

输入Str(Str的长度 <= 100000)

Output

输出最长回文子串的长度L。

Input示例

daabaac

Output示例

5

相关问题

约束性较大基本上用于求最大回文串字符  N(o)复杂度。

字符串分为奇偶串,但预处理一下可以全部变为奇串。在每两各自符之间加一个特殊符号,最前面需要加字符因为有越界情况。

(2×id-i)时可能越界。

#include<string.h>
#include<math.h>
#include<stdio.h>
#include<iostream>
const int maxn =1000010;
using namespace std;
char new_l[maxn<<1];
char old_l[maxn];
int p[maxn<<1];
int manacher()
{
	int i,id=0,mx=0;//mx表示以id为中心的回文串的右边长度
	int max_len=0;
	for(i=1;new_l[i];i++)
	{
		if(mx>i)  p[i]=min(p[2*id-i],mx-i);//因为回文串的长度如果小于最大回文串的,(2*id-i)表示与i关于id对称的字符串的长度,而此时的长度最少等于d[2*id-i];
		else   p[i]=1;
		while(new_l[i-p[i]]==new_l[i+p[i]]) p[i]++;
		if(mx<i+p[i])//i表示位置而p[i]为回文串的一边的长度,如果越界了暴力求解
		{
			mx=i+p[i];
			id=i;
		}
		max_len=max(max_len,p[i]-1);
	}
	cout<<max_len<<endl;
	return 0;
}
int main()
{
	cin>>old_l;
	int j=2;
	int len=strlen(old_l);
	new_l[0]='$';
	new_l[1]='#';
	for(int i=0;i<len;i++)
	{
		new_l[j++]=old_l[i];
		new_l[j++]='#';
	}
	new_l[j]='\0';
	manacher();
	return 0;
}

https://blog.csdn.net/dyx404514/article/details/42061017这个大佬博客有详细图片

猜你喜欢

转载自blog.csdn.net/qq_41453511/article/details/81154092