模板

计算出字符串中以每个字符为对称中心的最长回文串的长度加\(1\)的值。
时间复杂度为\(O(n)\)

#include<bits/stdc++.h>
#define LL long long
#define PII pair<int,int>
#define PLI pair<LL,int>
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define lowbit(x) (x&(-x))
using namespace std;

const int maxn=1e7+2e6;
int p[3*maxn],len1,len2;
char s[maxn],str[3*maxn];

void init(){
    len1=strlen(s);
    len2=2*len1+2;
    str[0]='$';
    str[1]='#';
    for(int i=0;i<len1;i++){
        str[i*2+2]=s[i];
        str[i*2+3]='#';
    }
}

void manacher(){
    int id,mx=0;
    for(int i=1;i<len2;i++){
        if(mx>i) p[i]=min(p[2*id-i],mx-i);
        else p[i]=1;
        for(;str[i-p[i]]==str[i+p[i]];p[i]++);
        if(i+p[i]>mx){
            mx=i+p[i];
            id=i;
        }
    }
}

int main(){
    scanf("%s",s);
    init();
    manacher();
    int ans=0;
    for(int i=1;i<len2;i++){
        ans=max(ans,p[i]);
    }
    printf("%d\n",ans-1);
}

模板题:hdu3068 最长回文

posted @ 2020-07-02 23:30  fxq1304  阅读(11)  评论(0编辑  收藏  举报