码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-01-19 11:18:45      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:manacher   its   har   str   ==   int   min   turn   hdu   

#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;
    }
}

 

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

标签:manacher   its   har   str   ==   int   min   turn   hdu   

原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/10290506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!