首页 > 其他分享 >manacher

manacher

时间:2023-11-14 15:46:35浏览次数:29  
标签:le manacher len mx id 回文

\(\mathrm{manacher}\) 算法可以在线性时间内求出一个串中的最长回文子串。

为了解决偶回文串的中心点非整数,在每个字符之间添加一个字符 #

为防止越界问题再在串的前后加上奇怪的符号。

记 \(mx\) 为当前最长回文串的右端,\(id\) 为串中心的位置,\(len_{id}\) 为以 \(id\) 为中心最多能向右扩展的长度。

此处 \(mx,my\) 与 \(i,j\) 关于 \(id\) 对称。

  • \(i\ge mx\),令 \(len_i=1\)。

  • \(i<mx\)

    • \(len_j\le mx-i\)

      如上图,此时 \(i\) 的最右端还在 \(mx\) 内,令 \(len_i=len_j\) 即可。

    • \(len_j>mx-i\)

​ 此时 \(i\) 超过 \(mx\),对 \(mx\) 进行更新,将中间点 \(id\) 换为 \(i\),更新回文串长度。


P3805 【模板】manacher

板子如下。

int n;char t[N],s[N<<1];
int len[N<<1];
void getstr(){
	int m=0;s[m++]='@';
	for(int i=1;i<=n;i++)
		s[m++]='#',s[m++]=t[i];
	s[m++]='#',s[n=m]=0;
}
int manacher(){
	int mx=0,id,mxlen=0;
	for(int i=1;i<n;i++){
		if(mx>i)len[i]=min(mx-i,len[2*id-i]);
		else len[i]=1;
		while(s[i+len[i]]==s[i-len[i]])len[i]++;
		if(len[i]+i>mx){
			mx=len[i]+i,id=i;
			mxlen=max(mxlen,len[i]);
		}
	}
	return mxlen-1;
}
int main(){
	scanf("%s",t+1),n=strlen(t+1);
	getstr();
	printf("%d\n",manacher());
	
	return 0;
}

P6216 回文匹配

给出长为 \(n\) 的串 \(s\) 和长为 \(m\) 的串 \(t\),问有多少四元组 \((l,r,i,j)\) 满足:

  • \(1\le l\le i\le j\le r\le n\)。

  • \(s[l:r]\) 是奇回文串。

  • \(s[i:j]=t\)。

答案对 \(2^{32}\) 取模。

用 \(\mathrm{kmp}\) 跑出每对 \((i,j)\),\(\mathrm{manacher}\) 跑出所有中心的最长回文串(不需要在中间加特殊字符,因为只要求奇回文串)。

对于 \(t\) 在 \(s\) 中的每个出现,将其下标的值设为 \(1\) 并作前缀和。查询 \(t\) 在 \([l,r]\) 中的出现次数即 \(sum_{r-m+1}-sum_{l-1}\)。

每个回文串都是区间查,所以作二阶前缀和即可。

record


标签:le,manacher,len,mx,id,回文
From: https://www.cnblogs.com/SError0819/p/17831751.html

相关文章

  • 洛谷P3805 【模板】manacher
    题目链接:https://www.luogu.com.cn/problem/P3805manacher算法模板题。参考资料:https://oi-wiki.org/string/manacher/示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=2.2e7+5;intn;chars[maxn/2],a[maxn];intp[maxn];voidinit(){......
  • Manacher学习笔记
    1.介绍:manacher算法用于求解回文子串问题,可以求出以一个串中每一点为中心的最长回文半径,相当于可以求出所有回文子串2.引入:假如要求出一个串所有长度为奇数的回文子串,暴力怎么做?枚举以每个点为回文中心,向两侧扩展,分别比较a[p+i]与a[p-i]时间复杂度O(n^2)我们考虑优化,我们......
  • manacher 回文串处理算法
    忘了具体什么时候写的,应该是2023.8初这算是个算法复习,因为我太菜了以前学的都不会了。manacher回文串处理算法其实这个我已经看两天了却一直没有看懂,觉得自己很愚笨,结果发现是自己一直不想去理解吧,然后今天仔细研究了以后发现就是那么个东西,没有什么很深奥的东西,那就自己整......
  • 洛谷:manacher
    【模板】manacher算法题目描述给出一个只由小写英文字符\(\texttta,\textttb,\textttc,\ldots\texttty,\textttz\)组成的字符串\(S\),求\(S\)中最长回文串的长度。字符串长度为\(n\)。输入格式一行小写英文字符\(\texttta,\textttb,\textttc,\cdots,\textt......
  • Manacher——最快的找最长回文算法
    Manacher马拉车——Manacher算法解决的问题给定一串字符串str,求str内的最长回文子串,我们可以从最朴素的算法开始,逐渐深入Manacher算法。朴素穷举法一直枚举字符串str的子串,并判断子串是否为回文。这个时间复杂度直接到\(O(n^3)\)了,一般题目都会超时。中心扩散法作为一个回文......
  • 【学习笔记】Manacher(马拉车)求回文子串
    点击查看目录目录参考资料与图片来源算法思路具体实现例题解题参考资料与图片来源参考博客我觉得这个博客讲的不好,他只讲看规律得到的结论,原因却不说,怪。参考博客2oi-wiki算法思路对于长度可能为奇可能为偶的情况,首先要预处理字符串,在每个字符左右增加一个无关字符#。......
  • 算法学习-Manacher
    什么是ManacherManacher算法可以以\(O(|S|)\)的时间复杂度求出一个字符串的最长回文子串。算法过程令\(k_i\)为以\(i\)为回文中心向右扩展到的最远的位置(即若串\(T_{l\simr}\)回文串,那么\(T\)的回文中心为\(T_{\frac{l+r}{2}}\)),注意到偶数长度的串不具有回文中心......
  • Manacher笔记
    Manacher算法应用于一种特定的场景:查找一个长度为\(n\)的字符串\(S\)的最长回文子串,Manacher的复杂度为\(O(n)\),是这种场景中效率最高的算法。首先对字符串\(S\)做一个变换来化简问题,原字符串的“中心字符”可能有一个或者两个。在\(S\)的每个字符左右各插入一个不......
  • manacher(马拉车)算法C++详解
    马拉车的定义马拉车本质是对中心扩展法(暴力算法)的优化。马拉车是干什么的Manacher算法帮助我们在给定的字符串中找到最长的回文子串。为了简单起见,我们先只处理有奇数个字符的字符串,关于偶数个字符的字符串,在文章最后会给出解法。我们的处理思路和暴力算法基本一致,那就是从左......
  • Manacher模板,支持自定义不同字符的相等关系
    #include<bits/stdc++.h>usingnamespacestd;structManacher{  structChar{    charch;    Char(){}    Char(charch):ch(ch){}    Char&operator=(constchar&r){      ch=r;      ret......