Luogu 3805(manacher)

本文介绍了一个使用Manacher算法解决字符串最长回文子串问题的实现案例。通过将原始字符串进行预处理并应用Manacher算法,文章提供了一段C++代码示例,详细展示了如何寻找给定字符串中的最长回文子串。
摘要由CSDN通过智能技术生成

传送门

模板题。

注意:id要初始化为0,否则本地都会RE(局部变量的初值不会自动为0)。

P.S.本文可能是本菜鸡AFO之前最后一篇(或者几篇)博文。7月底开始写博客时第二篇便是manacher,现在以此收尾,不得不感叹时间飞逝~~最后几天好好努力吧!

#include<cstdio>
#include<cstring>
#include<iostream>
#include<ostream>
#include<fstream>
#include<algorithm>
using namespace std;
const int N=11000000+4;
char a[N],b[N<<1];
int n,p[N<<1],ans=0;
inline void manacher() {
	b[0]='$';
	for (register int i=0;i<n;++i)
		b[i<<1|1]='#',b[(i<<1)+2]=a[i];
	int nn=n<<1|1,mx=0,id=0;
	b[nn]='#';
	for (register int i=1;i<=nn;++i) {
		p[i]=mx>i?min(p[(id<<1)-i],mx-i):1;
		while (b[i+p[i]]==b[i-p[i]]) ++p[i];
		if (mx<i+p[i]) id=i,mx=i+p[i];
		ans=max(ans,p[i]-1);
	}
}
int main() {
	fread(a,1,11000000,stdin);
	n=strlen(a);
	manacher();
	cout<<ans<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值