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;    
} 
posted @ 2020-06-28 21:00  Sakura_Momoko  阅读(112)  评论(0编辑  收藏  举报