class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < 2) return s;
string t = "$";
for (int i = 0; i < n; i++) {
t += "#";
t += s[i];
}
t += "#@";
n = n*2+3;
vector<int> p(n, 0);
int id = 0, mx = 0;
int max_len = -1;
int index = 0;
for (int i = 1; i < n-1; i ++) {
p[i] = mx > i ? min(p[2*id-i], mx-i) : 1;
while (t[i+p[i]] == t[i-p[i]])
p[i]++;
if (mx < p[i] + i) {
mx = p[i] + i;
id = i;
}
if (max_len < p[i] - 1) {
max_len = p[i] - 1;
index = i;
}
}
int start = (index-max_len) / 2;
return s.substr(start, max_len);
}
};