string preProcess(string s)
{
int n=s.size();
if(n==0)
return string("^$");
string ret("^");
for(int i=0;i<n;++i)
{
ret+="#"+s.substr(i,1);
}
ret+="#$";
return ret;
}
string longestPalindrome(string s)
{
string T=preProcess(s);
const int n=T.size();
int p[n];
int c=0,r=0;
for(int i=1;i<n-1;++i)
{
int mirror=2*c-i;
p[i]=(r>i)?min(r-i,p[mirror]):0;
while(T[i+p[i]+1]==T[i-p[i]-1])
++p[i];
if(i+p[i]>r)
{
r=i+p[i];
c=i;
}
}
int index=0,max_len=0;
for(int i=1;i<n-1;++i)
{
if(p[i]>max_len)
{
max_len=p[i];
index=i;
}
}
return s.substr((index-max_len-1)/2,max_len);
}