洛谷3805:【模板】manacher算法——题解

https://www.luogu.org/problemnew/show/P3805

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

板子题,大致讲解可以看POJ3974:Palindrome

以及还是不明白为什么我的manacher只要写成函数就会变慢整整一倍,逼于无奈代码只好丑一点。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=22000020;
int l,p[N];
char s[N];
int main(){
    cin>>s+1;
    l=strlen(s+1);
    s[0]='@';
    for(int i=l;i>=1;i--)s[i*2]=s[i];
    for(int i=1;i<=2*l+1;i+=2)s[i]='#';
    s[2*l+2]='?';
    l=2*l+1;
    int ans=0,id,mx;
    for(int i=1;i<l;i++){
    if(i<mx)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){
        mx=i+p[i];
        id=i;
    }
    ans=max(ans,p[i]);
    }
    printf("%d\n",ans-1);
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

posted @ 2018-04-03 17:03  luyouqi233  阅读(206)  评论(0编辑  收藏  举报