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
|
class Manacher { vector<int> d1; vector<int> d2; public: Manacher(const string& s) { int n = s.size(); d1.resize(n); d2.resize(n); for (int i = 0, l = 0, r = -1; i < n; i++) { int k = (i > r) ? 1 : min(d1[l + r - i], r - i + 1); while (0 <= i - k && i + k < n && s[i - k] == s[i + k]) { k++; } d1[i] = k--; if (i + k > r) { l = i - k; r = i + k; } }
for (int i = 0, l = 0, r = -1; i < n; i++) { int k = (i > r) ? 0 : min(d2[l + r - i + 1], r - i + 1); while (0 <= i - k - 1 && i + k < n && s[i - k - 1] == s[i + k]) { k++; } d2[i] = k--; if (i + k > r) { l = i - k - 1; r = i + k; } } }
bool isPalindrome(int b, int e) { if((e-b)%2) { int c = b + (e-b) / 2; int r = c - b + 1; return d1[c] >= r; } else { int c = b + (e-b) / 2; int r = c - b; return d2[c] >= r; } }
pair<int, int> longestPalindrome() { int b=0, e=0; for(int c=0;c<d1.size();c++) { if(d1[c]*2-1>e-b) { b = c+1-d1[c]; e = c + d1[c]; } if(d2[c]*2>e-b) { b = c - d2[c]; e = c + d2[c]; } } return {b, e}; } };
|