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); }
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); }