class Solution {
public:
    void manacher(string s,int n,vector<int>& p){
        int m = 0;
        int r = m + p[0]; //回文串的最右点
        for(int i = 1; i < n; i++){
          //当新中心在之前的回文中时
            if(r > i)
                p[i] = p[2*m-i]<(r - i)?p[2*m-i]:(r-i);
          //r-i表示最右点离新中心的距离,p[2*m-i] = p[i],以m为中心
          //半径p增长,得到以i为中心的最长半径
            for(;s[i + p[i]] == s[i - p[i]] && i - p[i] >= 0 && i + p[i] < 2 * n - 1; p[i]++){
                if(r < i + p[i]){
                  //更新回文中心和最右点
                    r = i + p[i];
                    m = i;
                }
            }
        }
    }
    
    int getLongestPalindrome(string A, int n) {
        string s;
        vector<int> p(2*n+1,1);
        for(int i = 0;i<n+1;i++)  //预处理,插入特殊字符,包含终止符
        {
           s.push_back('#');  
           s.push_back(A[i]);
        }
        
        manacher(s, 2*n+1, p);//计算
        
        int max_len = 0;//寻找最大值
        for(auto i : p){
            max_len = max(max_len,i-1);
        }
        return max_len;
    }
};