51nod 1089 最长回文字串

http://blog.csdn.net/h1021456873/article/details/49507197

他写的很好

但是时间复杂度 不是很明白

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<iterator>
#include<stack>

using namespace std;

#define ll  __int64
#define MAXN  100010
#define inf  1000000007

char z[MAXN*2+10],y[MAXN*2];
int p[MAXN];

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

}
int main()
{
    scanf("%s",y);
    int l=1;
    z[0]='&';
    z[l++]='#';
    int len=strlen(y);
    for(int i=0;i<len;i++)
    {
        z[l++]=y[i];
        z[l++]='#';
    }
    Mana(l);
    int ans=0;
    for(int i=0;i<l;i++)
        ans=max(ans,p[i]);
    printf("%d
",ans-1);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/cherryMJY/p/6845603.html