首页 > 其他分享 >Manacher

Manacher

时间:2023-05-18 22:13:59浏览次数:33  
标签:cnt ++ Manacher len int ans

Manacher的几个模板


模板一

前后插入不等的特殊字符 ( 不用写越界的判断条件 )
中间用 # 隔离 ( 不用判断奇偶 )

#include <bits/stdc++.h>
using namespace std;
const int N = 22000005;

char s[N],t[N];
int cnt , mr , mid , len[N];

void build()
{
	cin >> s;
	t[++cnt] = '~' , t[++cnt] = '#';
	int n = strlen(s);
	for(int i = 0 ; i < n ; ++i)
		t[++cnt] = s[i] , t[++cnt] = '#';
	t[++cnt] = '!';
	
} 
void Slove()
{
	int ans = 0;
	for(int i = 2 ; i <= cnt - 1 ; ++i){
		if(i <= mr) len[i] = min(len[2 * mid - i]  , mr - i + 1);
		else len[i] = 1;
		while(t[i - len[i]] == t[i + len[i]]) ++len[i];
		--len[i];
		if(i + len[i] > mr) mid = i , mr = i + len[i];
		ans = max(ans , (len[i] * 2 + 1 ) / 2 );
	}
	cout << ans << '\n';
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	return build() , Slove() , 0;	
}

模板二


标签:cnt,++,Manacher,len,int,ans
From: https://www.cnblogs.com/xqy2003/p/17413422.html

相关文章

  • codeforces 159D D. Palindrome pairs( manacher+dp )
    题目链接:codeforces159D题目大意:给出一个字符出,求取这个字符串中互相不覆盖的两个回文子串的对数。题目分析:首先能够用manacher模板,因为这个算法处理的字符串的长度式奇数,所以我们首先将原字符串拓展,也就是用一个没有出现过的子串填充到每两个字符之间,首位也要添加,这样处理后得到......
  • 马拉车(manacher) & 回文自动机(PAM)
    读了徐安矣2023年集训队论文写的,对于差分性质和习题,我会在理解清楚之后再补充。本篇博客仅讨论前两种算法。首先,马拉车和回文自动机都是处理回文串问题的。但在此之前,学习一些更加简单的回文算法。小trick:把给定串的两头和缝隙插入相同字符,且在边界处用不同字符标记,使得长度为......
  • Manacher
    算法简介Manacher算法用于求解一串字符串中的最长回文子串的长度。如:abab的最长回文子串的长度为3。时间复杂度$O(n)$实现原理1.构造回文串有两种情况:情况1:abba,其对称轴在两字符中间情况2:abcba,其对称轴在中间字符上由于Manacher算法只能处理第二种情况,所以要......
  • 算法学习笔记(13): Manacher算法
    Manacher算法形象的被译为马拉车算法这个算法用于处理简单的回文字符串的问题。可以在\(O(n)\)的复杂度内处理出每一个位置为中心的回文串的最长长度。为了避免出现......
  • manacher算法
    manacher算法斯♥哈♥学长的博客https://www.cnblogs.com/luckyblock/p/17044694.html#5140558为什么老师叫他马拉车算法/yiw简介我们都知道,求最长回文子串可以枚举每......
  • Manacher算法
    文章默认给定字符串中只会出现小写英文字母介绍通过已经学习了的字符串哈希,我们可以用\(O(n\logn)\)的时间复杂度求解一个串中的最长回文子串了,那么我们思考一下是......
  • 「笔记」manacher 算法
    目录写在前面简介算法流程复杂度证明写在最后写在前面才发现好久没写知识笔记了……神兵小将真好看,感觉好像年轻了十岁,有一种莫名的沉浸式的体验。还记得当年特别喜欢......
  • Manacher(马拉车)
    Manacher算法:最长回文串(以每个点为中心的回文串长度)直接上代码MY_Code://22.10.8Manacher顶级理解#include<bits/stdc++.h>usingnamespacestd;constintN=4e7;......
  • Manacher
    通过在字符串之间的每个空位内插入字符,是的奇数和偶数成为一样得情况,从而能够统一处理。用len[]记录每个点能够扩展出的最长半径,mx记录扩展到的最远右端点,id记录mx为右端......
  • 【模板】最长回文串长度 manacher
    \(pa_i\)表示以\(i\)为中心的(原串的)回文串长度#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;typedeflonglongLL;intn,m,pa[......