题解 | #最长回文子串#
最长回文子串
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")
查看12道真题和解析