manacher模板

Posted cherrypill

tags:

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

详细讲解可以看这个

下面只是些模板


纯模板

int manacher()
{
     // 将数组初始化
    init();
   
    int p[N*2],ans=0,mx=0,max_len=-1,id=0,index;
    // p[i]代表以i为中心的回文串半径,p[i]-1是以i为中心的最长回文串(相对于原字符串)
    //中心点最右端位置mx,id是中心点
    // max_len是该中心点的半径
    //(中心点是指目前半径最长的点)
    for (int i = 1; i < a.size();i++)
    {
        p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
        //i+p[i]刚好是‘未知点‘
        while(a[i+p[i]]==a[i-p[i]])
            p[i]++;
        if(mx<i+p[i])
        {
            mx = i + p[i];
            id = i;
        }
    }
    for (int i = 0; i < a.size();i++)
        ans = max(p[i] - 1, ans);
    return ans;
}

吉哥系列故事——完美队形II

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int n,T,x,ans;
vector<int> a;
int manacher()
{
    int p[N*2],ans=0,mx=0,max_len=-1,id=0,index;
    // p[i]代表以i为中心的回文串半径,p[i]-1是以i为中心的最长回文串(相对于原字符串)
    //中心点最右端位置mx,id是中心点
    // max_len是该中心点的半径
    //(中心点是指目前半径最长的点)
    for (int i = 1; i < a.size();i++)
    {
        p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
        //i+p[i]刚好是‘未知点‘
        while(a[i+p[i]]==a[i-p[i]]&&a[i+p[i]-2]>=a[i+p[i]])//要记住马拉车中间加了个奇怪字符
            p[i]++;
        if(mx<i+p[i])
        {
            mx = i + p[i];
            id = i;
        }
    }
    for (int i = 0; i < a.size();i++)
        ans = max(p[i] - 1, ans);
    return ans;
}
int main()
{
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        a.clear();
        a.push_back(-1);
        a.push_back(0);
        for (int i = 1; i <= n;i++)
        {
            scanf("%d", &x); //x in 50~250;
            a.push_back(x);
            a.push_back(0);
        }
        printf("%d
",manacher());
    }
    return 0;    
} 

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

manacher马拉车算法

Manacher模板

HDU 3068 最长回文(manacher模板题)

P3805 模板manacher算法(马拉车)

manacher模板

洛谷P3805 [模板]Manacher算法 [manacher]