string manacherInit(string s){ // 形成新的字符串 if (s.size() == 0) return"^$"; string ans = "^"; for (auto c : s) ans += '#', ans += c; ans += "#$"; return ans; }
intmanacher(string ss){ string s = manacherInit(ss); vector<int> p(s.size()); int ans = -1, cc = 0, rr = 0; for (int i = 1; i < s.size(); ++i) { if (i < rr) p[i] = min(p[2 * cc - i], rr - i); // p[i]的初始值 else p[i] = 1; while (s[i - p[i]] == s[i + p[i]]) ++p[i]; // 继续扩展回文串 if (rr < i + p[i]) cc = i, rr = i + p[i]; // 出现右边界更大的回文串 ans = max(ans, p[i] - 1); // 记录答案 } return ans; }