P3805 【模板】manacher算法

题目描述

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

字符串长度为n

输入格式

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

输出格式

一个整数表示答案

输入输出样例

输入 #1复制
aaa
输出 #1复制
3

说明/提示

字符串长度len <= 11000000

 

#include
#include
#include
#include
#include
#include
using namespace std;
char data[22000666];
int p[22000666],cnt,ans;
void read(){
	char c=getchar();
	data[0]='~',data[cnt=1]='|';
	while(c<'a'||c>'z'){
		c=getchar();
	}
	while(c>='a'&&c<='z'){
		data[++cnt]=c;
		data[++cnt]='|';
		c=getchar();
	}
}
int main(){
	read();
	for(int t=1,r=0,mid=0;t<=cnt;++t){
        if(t<=r){
			p[t]=min(p[mid*2-t],r-t+1);
		}
        while(data[t-p[t]]==data[t+p[t]]){
			p[t]++;
		}
        if(p[t]+t>r){
			r=p[t]+t-1,mid=t;
		}
        if(p[t]>ans){
			ans=p[t];
		}
	}
	printf("%d",ans-1);
	return 0;
}

  

 

你可能感兴趣的:(P3805 【模板】manacher算法)