首页 > 其他分享 >Manacher(马拉车)

Manacher(马拉车)

时间:2022-11-16 14:38:30浏览次数:48  
标签:最右 int Manacher pos maxr 拉车 回文

Manacher算法:最长回文串(以每个点为中心的回文串长度)

直接上代码

MY_Code:

//22.10.8 Manacher顶级理解 
#include<bits/stdc++.h>
using namespace std;

const int N=4e7;
int pos,maxr;//最右回文串的中心点、右端点 
int p[N];//以i为中心的最长回文串长度 
char str[N],s[N];

int main(){
	
	cin>>(s+1);
	int n=strlen(s+1);
	
	//每个字符中间插入一个[奇怪的字符],不用对偶数回文与奇数回文特殊判断
	//另一方面暴力宽扩展的时候到达边界即可停止,因为边界符号最[奇怪] 
	for(int i=1;i<=n;i++){
		
		str[i<<1]=s[i];
		str[(i<<1)|1]='#';
		
	} 
	str[0]='@';
	str[1]='#';
	n=(n<<1)|1; 
	
	for(int i=1;i<=n;i++){
		
		//充分利用回文串的对称性以及回文串已处理长度 
		if(i<maxr){
		//对于一个点 如果i<maxr,即可处理i关于pos对称点j已处理的回文串大小 
		//但是即便对称点回文长度再大,也不可能超过maxr
		//同时在p[j]极长时即i+p[j]>maxr了,可使用的已处理回文串长度不会超过maxr-i,因为之后没有一个回文串扩展到,是未知的 
			p[i]=min(p[(pos<<1)-i],maxr-i);
		}
		while(str[i-p[i]-1]==str[i+p[i]+1]) p[i]++;//基操 暴力扩展 
		if(i+p[i]>maxr){//维护最右的回文串的pos与maxr 
			maxr=i+p[i];
			pos=i;
		}
		
	}
	
	int ans=1;
	for(int i=1;i<=n;i++){
		
		ans=max(ans,p[i]);
		//左边扩展k个字符,相应的右边也是扩展k个字符,
	    //我们去除所有#号后得到的正好就是p[i]大小
		
	}
	
	printf("%d\n",ans);
	
	return 0;
}

标签:最右,int,Manacher,pos,maxr,拉车,回文
From: https://www.cnblogs.com/Diamondan/p/16895786.html

相关文章

  • Manacher
    通过在字符串之间的每个空位内插入字符,是的奇数和偶数成为一样得情况,从而能够统一处理。用len[]记录每个点能够扩展出的最长半径,mx记录扩展到的最远右端点,id记录mx为右端......
  • 【模板】最长回文串长度 manacher
    \(pa_i\)表示以\(i\)为中心的(原串的)回文串长度#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;intn,m,pa[......
  • 关于 manacher 的一个小细节
    在该算法中,我们需要用到一个数组hw[i],代表i的最大回文半径。而且这个半径不包括i本身(若串为ccc则hw为1)。这时最终答案为最大的hw减一。为什么要减一呢?最终......
  • manacher
    manacher\(manacher\),一个可以做到\(O(n)\)求解一个字符串中的所有回文子串。我们有一种\(O(n^2)\)的算法来求回文子串,枚举回文中心一点一点比较。基于\(O(n^2)\)......
  • HDU 3068 最长回文——————Manacher
    最长回文TimeLimit:4000/2000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):30806AcceptedSubmission(s):11310ProblemDescrip......
  • 51Nod 1088 最长回文子串——————Manacher,马拉车算法
    ​​51Nod1088最长回文子串​​基准时间限制:1秒空间限制:131072KB分值:0难度:基础题回文串是指这种左右对称的字符串。输入一个字符串,输出里最长回文子串的长度。I......
  • 主说,马要拉车,于是马就学会了拉车。
    \(\operatorname{Manacher}\)算法大体来讲并不难,使用它可以在线性时间内求出某字符串中最大回文子串的长度。基础首先我们知道一个回文串的长度可以是奇数(存在回文中心),......
  • Manacher 和 回文自动机
    引入求串\(s\)中的回文子串数量。\(|s|\le10^7\)。做法定义一个长为\(2k-1(k\inN)\)的回文串\(s\)的回文中心为\(s_k\)。则子串\(s_2\sims_{2k-2}\),\(s_3\si......
  • 简单易懂的manacher算法讲解
    manacher求最长回文子串的算法(顺便还能求出来以每个点为中心的最长回文子串)介绍先来一道模板题:P3805【模板】manacher算法先考虑一下小学二年级都会的纯暴力解法:以每......
  • 马拉车
    #include<bits/stdc++.h>usingnamespacestd;strings,ss;intp[100100];intmain(){cin>>s;ss+="*#";intlen=s.length();for(inti=......