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\n",manacher());
    }
    return 0;    
} 

原文链接: https://www.cnblogs.com/cherrypill/p/13205017.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    manacher模板

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/359934

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午1:01
下一篇 2023年3月2日 下午1:01

相关推荐