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); }