manacher

用于在字符串中寻找最长回文子串的高效算法
Manacher 算法的核心思想是利用已经计算出的回文子串的信息来加速后续的计算。它通过在原始字符串的每个字符之间插入一个特殊字符(通常用#),将奇数长度和偶数长度的回文子串统一处理,使得每个回文子串都以一个字符为中心对称。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
string a, s;
int r[N];
int intt()	//中间加入“#”以便判断偶数回文串
{
	s[0]='$';
	s[1]='#';
	int l=a.size();
	int k=1;
	for(int i=0;i<l;i++)
	{
		s[++k]=a[i];
		s[++k]='#';
	}
	s[++k]=' ';
	return k;
}
void manacher()
{
	int n=intt();
	int p=1,mx=1;
	for(int i=1;i<=n;i++)
	{
		if(i<mx)	r[i]=min(mx-i,r[p*2-i]);	
		else 		r[i]=1;
		while(s[i+r[i]]==s[i-r[i]])
			r[i]++;
		if(i+r[i]>mx)
			p=i,mx=i+r[i];
	}
}
int main()
{
	cin>>a;
	manacher();
	return 0;
}
posted @   流氓兔LMT  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示