题解 | #最长回文子串#
最长回文子串
https://www.nowcoder.com/practice/12e081cd10ee4794a2bd70c7d68f5507
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 1010; int kr[N]; string pail(string s) { string str(2 * s.size() + 1, ' '); for(int i = 2 * s.size(); i >= 0; i -= 2) { str[i] = '*'; str[i - 1] = s[(i - 1) >> 1]; } int mid = 0, R = 0, c = 0; for(int i = 0; i < str.size(); i ++) { if(i < R) kr[i] = min(kr[2 * mid - i], R - i + 1); while(i - kr[i] >= 0 && i + kr[i] < str.size() && str[i - kr[i]] == str[i + kr[i]]) kr[i] ++ ; if(i + kr[i] > R) R = kr[i] + i - 1, mid = i; if(kr[i] > kr[c]) c = i; } int r = kr[c] - 1; int rr = r >> 1; c = c / 2; return s.substr(c - rr, r); } int main() { string s; getline(cin, s); s = pail(s); cout << s.size() ; return 0; } // 64 位输出请用 printf("%lld")