class Solution {
public:
string longestPalindrome(string s) {
string mana_str = "$#";
if (s.size() <= 1) {
return s;
}
for (auto str : s) {
mana_str += str;
mana_str += '#';
}
vector<int> p(mana_str.size(), 0);
int mx = 0;
int id = 0;
int max_len = -1, max_pos;
for(int i = 1; i < mana_str.size(); ++i) {
if (i < mx) {
p[i] = min(p[2*id - i], mx - i);
} else {
p[i] = 1;
}
while(mana_str[ i - p[i]] == mana_str[i + p[i]]) {
p[i]++;
}
if (mx < i + p[i]) {
mx = i + p[i];
id = i;
}
if (p[i] > max_len) {
max_len = p[i];
max_pos = i;
}
}
if ((max_len - 1) % 2) {
return s.substr(max_pos/2 - (max_len)/2 , max_len - 1);
} else {
return s.substr(max_pos/2 - (max_len-1)/2, max_len - 1);
}
}
};