manacher算法

Posted linhaitai

tags:

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

博客:

模版:

技术分享图片
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 2e5 + 10;
char s[maxn], sNew[maxn<<1];
int p[maxn<<1], id, mx=0;
int L, R; //回文串在原串的左右端点位置

int Init()
{
    int len = strlen(s);
    sNew[0] = $;
    sNew[1] = #;
    int j = 2;
    for (int i = 0; i < len; i++){
        sNew[j++] = s[i];
        sNew[j++] = #;
    }
    sNew[j] = ;
    return j;
}

int Manacher()
{
    int len = Init();
    int max_len = -1;
    mx = 0;
    for (int i = 1; i < len; i++){
        if (i < mx) p[i] = min(p[2 * id - i], mx - i);
        else p[i] = 1;

        ///在对象不是字符串时候,原本为了防止越界是左有‘$‘
        ///右有‘‘,现在右边就没有‘‘,需要人为填充替代!

        while (sNew[i - p[i]] == sNew[i + p[i]]) p[i]++;

        if (mx < i + p[i]){
            id = i;
            mx = i + p[i];
        }

        //max_len = max(max_len, p[i] - 1);

////      如果题目不要求输出回文串在原串的位置,则用下面代码更新答案
        if(max_len < p[i]){ ///这里L、R记录的是最长回文子串在原串的左右端点
            max_len = p[i];
            L = (i - p[i])>>1;
            R = (i + p[i] - 4)>>1; ///R = (i + p[i])/2 -2;
        }

    }
    return max_len;

///    最后如若需要找到的回文串则是
///    for(int i=(id-mx+1);i<=(id+mx-1);i++)
///         if(sNew[i]!=‘#‘&&sNew[i]!=‘$‘) ///注意你设置的开头符号和填充符号,不同则需要修改
///             putchar(sNew[i]);
}
View Code

 

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

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

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

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

Manacher

Manacher算法详解

P3805 模板manacher算法(马拉车)