Skip to content
  • Manacher
c++
std::string expend(const std::string& s) {
    std::string res = "@#";
    for (int i = 0; i < s.size(); i++) res += s[i], res += '#';
    res += '%';
    return res;
}
int get_Manacher_mx(std::string& s){
    std::string t=expend(s);
    std::vector<int>p(t.size());//回文半径数组
    int mx=0;
    for(int i=1,r=0,c=0; i < (int)t.size() - 1; i++){
        p[i] = (r > i) ? std::min(p[2*c-i], r-i) : 1;
        while(t[i-p[i]] == t[i+p[i]]) p[i]++;
        if(i + p[i] > r){
            r = i + p[i];
            c = i;
        }
        mx = std::max(mx, p[i]);
    }
    return mx - 1;
    //return p
}

获取真实最长回文串

c++
std::string Manacher(const std::string& s){
    std::string t=expend(s);
    std::vector<int>p(t.size());
    int mx=0,pos=0;
    for(int i=1,r=0,c=0;i<t.size()-1;i++){
        p[i]=(r>i?std::min(p[2*c-i],r-i):1);
        while(t[i-p[i]]==t[i+p[i]])p[i]++;
        if(i+p[i]>r){
            r=i+p[i];
            c=i;
        }
        if(p[i]>mx){
            mx=p[i];
            pos=i;
        }
    }
    int len=mx-1;
    int start=(pos-mx)/2;
    return s.substr(start,len);
}