class Solution
{
public:
string longestPalindrome(string s)
{
string sNew, longest;
int i, j = 0, iMax = 1, id = 1;
int p[2222];
memset(p, 0, sizeof(p));
sNew += '~';
for(i = 1; i < 2 * (s.size()) + 2; i++)
{
if(i % 2)
sNew += '#';
else
sNew += s[j++];
}
for(i = 1; i < 2 * (s.size()) + 2; i++)
{
if(i < iMax)
p[i] = min(p[2 * id - i], iMax - i);
else
p[i] = 1;
for(; sNew[i + p[i]] == sNew[i - p[i]]; p[i]++);
if(i + p[i] > iMax)
{
iMax = i + p[i];
id = i;
}
}
int mx = 0, flag;
for(i = 1; i < 2 * s.size() + 2; i++)
{
if(mx < p[i])
{
mx = p[i];
flag = i;
}
}
for(i = flag - mx + 2; i < flag + mx - 1; i += 2)
longest += sNew[i];
return longest;
}
};