1 string longestPalinderome(string s) {
2 int N = s.size();
3 int id = 0, mx = 0;
4 vector<int> dp(2 * N + 1);
5 for (int i = 0; i < 2 * N + 1; ++i) {
6 int j = 2 * id - i;
7 if (mx > i) {
8 dp[i] = min(mx - i, dp[j]);
9 }
10 int left = i - dp[i], right = i + dp[i];
11 for (; left >= 0 && right <= 2 * N; --left, ++right) {
12 if ((left & 1) == 0 || s[left / 2] == s[right / 2]) {
13 ++dp[i];
14 }
15 else
16 break;
17 }
18 if (dp[i] + i > mx) {
19 id = i;
20 mx = dp[i] + i;
21 }
22 }
23 int res = 0;
24 for (int i = 0; i < 2 * N + 1; ++i) {
25 if (dp[i] > dp[res])
26 res = i;
27 }
28 return s.substr(res / 2 - (dp[res] - 1) / 2, dp[res] - 1);
29 }