马拉车 o(n)(最长连续回文串) hdu 3068

#include<bits/stdc++.h>
const int maxn=1e6+10;
using namespace std;
int p[maxn*2+10];
string manacher(string ss)
{
    string tt="$#";
    for(int i=0;i<ss.size();i++){tt+=ss[i]; tt+="#";}
    int mx=0;
    int id=0;
    int mid=0;
    int ls=0;
    for(int i=1;i<tt.size();i++)
    {
        if(mx>i) p[i]=min(p[2*id-i],mx-i);
        else     p[i]=1;
        while(tt[i+p[i]]==tt[i-p[i]]) p[i]++;
        if(i+p[i]>mx)
        {
            mx=i+p[i];
            id=i;
        }
        if(ls<p[i])
        {
            ls=p[i]; mid=i;
        }
    }
    for(int i=1;i<tt.size();i++) p[i]=0;
    return ss.substr((mid - ls) / 2, ls - 1);
}
char a[maxn];
int main()
{
    while(scanf("%s",&a)!=EOF)
    {
        string ss="";
        int l=strlen(a);
        for(int i=0;i<l;i++) ss+=a[i];
        ss=manacher(ss);
        cout<<ss.size()<<endl;
    }
}

猜你喜欢

转载自www.cnblogs.com/Andromeda-Galaxy/p/10290506.html