class Solution {
int solve(vector<char> &s , int &ans)
{
int *p = new int[s.size()];
int n=s.size();
int mx=0,id,rst=1;
for(int i=0;i<n;++i)
{
if(mx>i)p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
for(;i+p[i]<n&&s[i-p[i]]==s[i+p[i]];p[i]++);
if(p[i]+i>mx)mx=p[i]+i,id=i;
if(ans<p[i]){
ans=p[i];
rst=i;
}
}
delete p;
ans--;
return rst;
}
public:
string longestPalindrome(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<char> vec;
vec.push_back('$');
vec.push_back('#');
int len=s.length(),i,j;
for(i=0;i<len;++i){
vec.push_back(s[i]);
vec.push_back('#');
}
int l=1;
int p=solve(vec,l);
if(p%2==0){
return s.substr(p/2-1-l/2,l);
}else{
return s.substr(p/2-l/2,l);
}
vec.clear();
}
};