String preProcess(String s) {
String res = "$#";
for (int i = 0; i < strlen(s), i ++) {
res += s[i];
res += "#";
}
res += "^";
return res;
}
String longestPalindrome(String s1) {
if(strlen(s1) <= 1)
return s1;
vector<int> p(n,0);
s = preProcess(s1);
int mx = 0, id = 0;
for (int i = 0; i < strlen(s)-1; i ++) {
p[i] = mx > i ? min(p[2*id], mx - i) : 1;
while(s[i + p[i]] == s[i - p[i]]) p[i] ++;
if(i + p[i] > max) {
max = i + p[i];
id = i;
}
}
int maxLen = 0, index = 0;
for( int i = 0; i < strlen(s)-1; i++) {
if(maxLen < p[i]){
maxLne = p[i];
index = i;
}
}
return s.substr((index - maxLen)/2, maxLen -1);
}