Exemple #1
0
std::string Manacher(std::string s) 
{
    std::string T = m_preProcess(s);
    //std::cout << "预处理:" << T << std::endl;
    int n = T.length();
    int* P = new int[n];
    int C = 0, R = 0;
    for (int i = 1; i < n - 1; i++) {
        int i_mirror = 2 * C - i; // 等于i' = C - (i - C)
        P[i] = (R > i) ? std::min(R-i, P[i_mirror]) : 0;
        // 扩展回文中心点至i
        while (T[i + 1 + P[i]] == T[i - 1 - P[i]])
            P[i]++;
 
        // 如果回文中心i超与咯R,就调整回文中心。
        if (i + P[i] > R) {
            C = i;
            R = i + P[i];
        }
    }
 
    // 找出P的最大元素
    int maxLen = 0;
    int centerIndex = 0;
    for (int i = 1; i < n - 1; i++) {
        if (P[i] > maxLen) {
            maxLen = P[i];
            centerIndex = i;
        }
    }
    delete[] P;
  
    return s.substr((centerIndex - 1 - maxLen) / 2, maxLen);
}
Exemple #2
0
std::string Manacher(std::string s) 
{
    std::string T = m_preProcess(s);
    std::cout << "PreProcessed: " << T << std::endl;
    int n = T.length();
    int* P = new int[n];
    int C = 0, R = 0;
    for (int i = 1; i < n - 1; i++) 
    {
        int i_mirror = 2 * C - i; // equals to i' = C - (i - C)
    
        P[i] = (R > i) ? std::min(R-i, P[i_mirror]) : 0;
    
        // Attempt to expand palindrome centered at i
        while (T[i + 1 + P[i]] == T[i - 1 - P[i]])
            P[i]++;
 
        // If palindrome centered at i expand past R,
        // adjust center based on expanded palindrome.
        if (i + P[i] > R) 
        {
            C = i;
            R = i + P[i];
        }
    }
 
    // Find the maximum element in P.
    int maxLen = 0;
    int centerIndex = 0;
    for (int i = 1; i < n - 1; i++) 
    {
        if (P[i] > maxLen) 
        {
            maxLen = P[i];
            centerIndex = i;
        }
    }
    delete[] P;
  
    return s.substr((centerIndex - 1 - maxLen) / 2, maxLen);
}