manacher 算法

· · 个人记录

概述

实现原理

int p[maxn];//此p为半径。 
il void manacher(string &S){
    string s="^#";
    For(i,0,(int)S.size()-1) s+=S[i],s+="#";
    s+="$";
    int to=s.size()-1,C=0,r=0;
    For(i,1,to){
        int ii=(C<<1)-i;
        if(r>i) p[i]=min(r-i,p[ii]);
        while(s[i+p[i]+1]==s[i-p[i]-1]) ++p[i];
        if(i+p[i]>r) r=i+p[i],C=i;
        ans=max(ans,p[i]);
    }
    return;
}