manacher算法

Posted downrainsun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了manacher算法相关的知识,希望对你有一定的参考价值。

https://blog.csdn.net/qq_16554583/article/details/79763296

https://blog.csdn.net/qq_41923622/article/details/80109897

最长回文

 HDU - 3068 

//马拉车算法基础模板,求最长的回文半径。
//其中init函数是把原来的字符串每个字母中间插入一个串里没有出现过的字符,其中这个字符从1开始,0的位置也用一个没出现过的字符代替。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxm = 3e5; char s[maxm], str[maxm]; int len1, len2, p[maxm], ans; void init() { str[0] = *; str[1] = #; for(int i = 0; i < len1; i++) { str[2 * i + 2] = s[i]; str[2 * i + 3] = #; } len2 = len1 * 2 + 2; //str[len2] = ‘&‘; } void manacher() { int id = 0, mx = 0; for(int i = 1; i < len2; i++) { if(mx > i) p[i] = min(p[2 * id - i], mx - i); else p[i] = 1; for(; str[i + p[i] ] == str[i - p[i] ]; p[i]++); if(p[i] + i > mx) { mx = p[i] + i; id = i; } } } int main() { while(~scanf("%s", s)) { len1 = strlen(s); init(); manacher(); ans = 0; for(int i = 0; i < len2; i++) { ans = max(ans, p[i]); } printf("%d ", ans - 1); } return 0; }

 

以上是关于manacher算法的主要内容,如果未能解决你的问题,请参考以下文章

Manacher 入门+模板 回文串专用算法

最长回文子串---Manacher算法

什么是Manacher(马拉车)算法-java代码实现

Manacher

Manacher算法详解

P3805 模板manacher算法(马拉车)