O(n)算法求最长回文串

#include <cstdio>
#define N  210000+10
#include <cstring>
#include <algorithm>
inline min(int a, int b){
    return a<b?a: b;
}
inline max(int a, int b){
    return a<b?b: a;
}
using namespace std;
char s[N*2+1];
int p[N*2+1] ;
int len;

void init()
{
    len=strlen(s);
    for(int i=len; i>=0; i--)
    {
        s[i*2+2]=s[i];
        s[i*2+1]='#';
    } 
    s[0]='$';
}

int getRec()
{
    int Max=-1;
    for(int i=2; i<2*len-1; i++)
    {
        Max=max(Max, p[i]-1);
    }
    return Max;
}
void solve()
{
    init();
    int id=0,  mx=0;
    for(int i=2; i< 2*len+1; i++)
    {
        //对称的位置,  但是要判断以下是否超过了mx的位置, 因为mx和 mx的后边还没有判断到,  所以不能超越; 
        if(mx >i) p[i]=min(p[2*id- i], mx-i);
        else p[i]=1;
        //判断一下是否对称 ; 
        while(s[i- p[i]] == s[i+ p[i]]) p[i]++;
        if(i+ p[i] >= mx)
        {
            id = i;
            mx=i+ p[i];
        }
    }
    printf("%d\n", getRec());
}

int main()
{
    while(scanf("%s", s) != EOF)
    {
        solve();
    }
    return 0; 
} 

 

posted on 2016-04-10 21:57  cleverbiger  阅读(109)  评论(0)    收藏  举报