hdu 3068一番長い回文

2884 ワード

昨日bcを見て問題を解きました。これを見つけました。これを新たに作り始めました。
manaacherアルゴリズム
このブログは素晴らしいです。無敵です。直接リンク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;
}