P3805 【模板】manacher算法

题目描述

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入格式

一行小写英文字符a,b,c...y,z组成的字符串S

输出格式

一个整数表示答案

输入输出样例

输入 #1
aaa
输出 #1
3

说明/提示

字符串长度len <= 11000000

思路

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=31000010;

char a[N],s[N];
int n,ans,hw[N];

void M() {
	int r=0,mid;
	for(int i=1; i<n; i++) {
		if(i<r)
			hw[i]=min(hw[(mid<<1)-i],hw[mid]+mid-i);
		else
			hw[i]=1;
		for(; s[i+hw[i]]==s[i-hw[i]]; ++hw[i]);
		if(hw[i]+i>r) {
			r=hw[i]+i;
			mid=i;
		}
	}
}

void change() {
	s[0]=s[1]='#';
	for(int i=0; i<n; i++) {
		s[i*2+2]=a[i];
		s[i*2+3]='#';
	}
	n=n*2+2;
	s[n]=0;
}

int main () {
	scanf("%s",a);
	n=strlen(a);
	change();
	M();
	ans=1;
	for(int i=0; i<n; i++)
		ans=max(ans,hw[i]);
	printf("%d\n",ans-1);
	return 0;
}

 

posted @ 2019-11-09 15:19  双子最可爱啦  阅读(127)  评论(0编辑  收藏  举报