马拉车算法 HDU3068

Posted 相儒以沫

tags:

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

附上博客http://blog.csdn.net/muxidreamtohit/article/details/8865210

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

int p[220010];
int n;
char a[220010];
char c[110010];

void build_p()
{
    int mx=0;
    int id=0;
    for(int i=0;i<n;i++)
    {
        if(i<mx)
        {
            p[i]=min(p[2*id-i],mx-i);
        }
        else
        {
            p[i]=1;
        }
        for(;a[i-p[i]]==a[i+p[i]]&&i-p[i]>=0&&i+p[i]<=n;p[i]++)
        {
        }
        if(p[i]+i>mx)
        {
            id=i;
            mx=p[i]+i;
        }
    }
}

int main()
{
    while(scanf("%s",&c)!=EOF)
    {
        int m=strlen(c);
        n=m*2+1;
        for(int i=0;i<n;i++)
        {
            if(i%2)
                a[i]=c[(i-1)/2];
            else
                a[i]=#;
        }
        build_p();
        int ma=0;
        for(int i=0;i<n;i++)
        {
            if(p[i]>ma)
                ma=p[i];
        }
        cout<<(ma-1)<<endl;
    }
    return 0;
}

 

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

hdu 3068 最长回文(马拉车)

hdu3068 最长回文 马拉车模板题

HDU-3068-最长回文-马拉车算法模板题

manacher马拉车算法

HDU 3068

manacher算法 O(n) 求字符串中最长回文子串 hdu 3068(模板题)