-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathlongestpalindrome.cpp
71 lines (52 loc) · 1.55 KB
/
longestpalindrome.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <bits/stdc++.h>
const int N = 1000000 + 1;
using namespace std;
int P[N * 2];
// Transform S into new string with special characters inserted.
string convertToNewString(const string &s)
{
string newString = "@"; // @ for avoiding bound checking
for (int i = 0; i < s.size(); i++) {
newString += "#" + s.substr(i, 1);
}
newString += "#$"; // $ for avoiding bound checking
return newString;
}
string longestPalindromeSubstring(const string &s)
{
string Q = convertToNewString(s);
int c = 0, r = 0; // current center, right limit
for (int i = 1; i < Q.size() - 1; i++) { //no boundaries
// find the corresponding letter in the palidrome subString
int iMirror = c - (i - c);
if(r > i) {
P[i] = min(r - i, P[iMirror]);
}
// expanding around center i
while (Q[i + 1 + P[i]] == Q[i - 1 - P[i]]){
P[i]++;
}
// Update c,r in case if the palindrome centered at i expands past r,
if (i + P[i] > r) {
c = i; // next center = i
r = i + P[i];
}
}
// Find the longest palindrome length in p.
int maxPalindrome = 0;
int centerIndex = 0;
for (int i = 1; i < Q.size() - 1; i++) {
if (P[i] > maxPalindrome) {
maxPalindrome = P[i];
centerIndex = i;
}
}
return s.substr( (centerIndex - 1 - maxPalindrome) / 2, maxPalindrome);
}
int main()
{
string s;
cin >> s;
cout << longestPalindromeSubstring(s);
return 0;
}