2013年11月2日 星期六

[HOJ] 80 - 最長回文子串


#include<stdio.h>
#include<algorithm>
using namespace std;
char a[10000005],s[20000005];
int p[20000005]={0},n;
int main(){
    int i,len;
    gets(&a[1]);
    s[0]=1;
    for(i=1;a[i];i++)
        s[i*2-1]=2,s[i*2]=a[i];
    s[i*2-1]=2,s[len=i*2]=0;
    n=len;
    int mx=0,id,ans=1;
    for(i=0;i<len;i++){
        if(mx>i) p[i]=min(p[id*2-i],mx-i);
        else p[i]=1;
        for(;s[i-p[i]]==s[i+p[i]];p[i]++);
        if(p[i]+i>mx) mx=p[i]+i,id=i;
        ans=max(ans,p[i]);
    }
    printf("%d\n",ans-1);
}

沒有留言:

張貼留言