#include <iostream> #include <string> #include <vector> #include <unordered_map> #include <algorithm> using namespace std; // 动态规划求最长回文子串的长度 int longestPalindrome(const string& s) { int n = s.size(); if (n == 0) return 0; vector<vector<bool>> dp(n, vector<bool>(n, false)); int max_length = 1; // 单个字符总是回文 for (int i = 0; i < n; ++i) { dp[i][i] = true; } // 检查长度为2的子串 for (int i = 0; i < n - 1; ++i) { if (s[i] == s[i + 1]) { dp[i][i + 1] = true; max_length = 2; } } // 检查长度大于2的子串 for (int length = 3; length <= n; ++length) { for (int i = 0; i <= n - length; ++i) { int j = i + length - 1; if (s[i] == s[j] && dp[i + 1][j - 1]) { dp[i][j] = true; max_length = length; } } } return max_length; } // 预处理字符串,移除只出现一次的字符 string preprocessString(const string& s) { unordered_map<char, int> charCount; for (char c : s) { charCount[c]++; } string result; for (char c : s) { if (charCount[c] > 1) { result += c; } } return result; } int main() { string input; getline(cin, input); // 预处理字符串 string processedString = preprocessString(input); // 计算最长对称子串的长度 int maxLength = longestPalindrome(processedString); // 输出结果 cout << maxLength << endl; return 0; }