#include <iostream> #include <vector> using namespace std; int main() { string os; cin >> os; string s {"#"}; for (auto c : os) { s += c; s += '#'; } //求最长对称子序列的长度,中心拓展法(n2),马拉车算法(n) int n = s.size(); vector<int> halfsize(n, 0); int maxright = 0; int maxmid = 0; int maxlen = 1; for (int mid = 1; mid < n ; mid++) { int left, right; left = right = mid; if (mid < maxright) { int leftmid = 2 * mid - maxmid; int maxleft = leftmid - halfsize[leftmid]; right = min(maxright, 2 * maxmid - maxleft); } left = 2 * mid - right; while (left > 0 && right < n - 1 && s[left - 1] == s[right + 1]) { left -- ; right ++; } if (right > maxright) { maxmid = mid; maxright = right; } int halflen = right - mid; halfsize[mid] = halflen; maxlen = max(maxlen,halflen); if (right == n - 1) { break; } } cout << maxlen; }