classSolution{public:int d[2002]={0};
string longestPalindrome(string s){
string s2 ="$#";int n = s.length();
s2.reserve(n *2+2);for(int i =0; i < n;++i){
s2 += s[i];
s2 +='#';}int N = s2.length()-1;
d[1]=1;int M =0;int P =0;for(int i =2, l=0, r =1; i <= N;++i){if(i <= r) d[i]=min(d[r - i + l], r - i +1);while(s2[i - d[i]]== s2[i + d[i]])d[i]++;if(i + d[i]-1> r) l = i - d[i]+1, r = i + d[i]-1;if(M < d[i]){
M = d[i];
P = i;}}int L =(P-1)/2;return s.substr(L-(d[P]-1)/2, d[P]-1);}};