hdu 3068 最长回文

昨日看bc题解。。发现又有这个东西了。。
于是就重新开始做这个东西。。

manacher算法

这个博客已经太好了,,无敌了。。
直接放链接
http://blog.csdn.net/xingyeyongheng/article/details/9310555

自己和他写的一模一样。。。

include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
char a[110000*2+10];
int p[110000*2+10];
int main()
{
    while(scanf("%s",a)==1)
    {
        int len=strlen(a);
        for(int i=len;i>=0;i--)
        {
            a[i*2+1]='#';
            a[i*2+2]=a[i];
        }
        a[0]='*';
        int id=0;
        int maxlen=0;
        for(int i=1;i<=2*len;i++)
        {
            if(p[id]+id>i)
            {
                p[i]=min(p[id]-(i-id),p[id-(i-id)]);
            }
            else
            {
                p[i]=1;
            }
            while(a[i-p[i]]==a[i+p[i]])
            {
                p[i]++;
            }
            if(p[i]+i>p[id]+id)
            {
                id=i;
            }
            maxlen=max(maxlen,p[i]);
        }
        cout<<maxlen-1<<endl;
    }
    return 0;
}

你可能感兴趣的:(HDU,Manacher)