ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Manacher

2022-07-02 12:31:10  阅读:133  来源: 互联网

标签:字符 int Manacher mid ans mx 回文


Manacher

题意 :

求最长回文串

预处理 :

奇回文串的对称中心是中间的字符,偶回文串对称中心是中间两个字符的空隙处,若分开处理很麻烦,因此在每两个字符中间插入一个字符|使得对称中心都为一个字符

算法 :

定义 p[i] : 以 i 为回文中心的最长回文半径 ( p[i]-1 为最长回文串的长度 )

定义 mxmid : 目前找到的回文串的右端的最右是mx,中心是mid

i的对称点为回文中心的字符串 \(=\) 以i为回文中心的字符串,因此p[i]可以等于p[j]

但是由于超过mx的部分(即右红边部分)不能保证必定等于左红边的部分,所以p[i]不能超过mx-i

时间复杂度 : \(O(n)\)

code :

#include <bits/stdc++.h>
using namespace std;

const int N=11000005;

#define re register

int n,m,p[N*2],ans=1;
char a[N],s[N*2];

inline void make_s(){
	s[0]='$',s[1]='|';
	for(re int i=0;i<n;++i){
		s[m++]=a[i];
		s[m++]='|';
	}
	s[m]='%';
	n=m;
}

inline int manacher(){
	int mid=1,mx=1;
	for(re int i=1;i<n;++i){
		if(i<mx)
			p[i]=min(p[mid*2-i],mx-i);
		else
			p[i]=1;
		for(;s[i+p[i]]==s[i-p[i]];++p[i]);
		if(p[i]+i>mx){
			mx=p[i]+i;
			mid=i;
		}
		ans=max(ans,p[i]-1);
	}
	return ans;
}

signed main(){
	scanf("%s",a);
	n=strlen(a);
    m=2;
	make_s();
	cout<<manacher();
}

标签:字符,int,Manacher,mid,ans,mx,回文
来源: https://www.cnblogs.com/into-qwq/p/16437063.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有