Алгоритм Манакера: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) (Новая страница: « char s[1000010]; int n, odd[1000010], even[1000010]; void oddPalindromesCount() { int l = 0, r = -1; for (int i = 0; i < n; i++) { int k =…») |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
{| width="100%" | |||
| width=50% | | |||
vector<int> oddPalindromeCount(string &s) { | |||
vector<int> palindromeCount(s.size(){{Changed|1=, 1}}); | |||
int l, r = -1; | |||
for (int i = 0; i < s.size(); i++) { | |||
int &p = palindromeCount[i]; | |||
for (int i = 0; i < | if (i <= r) | ||
int | p = min(palindromeCount[l + r - i], r - i); | ||
while (i - | |||
while (0 <= i - p && i + p < s.size() && s[i - p] == s[i + p]) | |||
p++; | |||
if (i + | |||
l = i - | if (i + p - 1 > r) { | ||
r = i + | l = i - p {{Changed|1=+ 1}}; | ||
r = i + p - 1; | |||
} | } | ||
} | } | ||
return palindromeCount; | |||
} | } | ||
vector<vector<int>> manacher(string &s) { | |||
string t = "#"; | |||
for (char c : s) { | |||
t += c; | |||
t += '#'; | |||
} | |||
vector<int> palindromeCount = oddPalindromeCount(t); | |||
int l | |||
for (int i = 0; i < | vector<vector<int>> res(2); | ||
int | for (int i = 0; i + 1 < palindromeCount.size(); i++) | ||
while (i - | res[i % 2].push_back(palindromeCount[i] / 2); | ||
return res; | |||
} | |||
if (i + | | width="10px" | | ||
l = i - | | width=50% | | ||
r = i + | vector<int> evenPalindromeCount(string &s) { | ||
vector<int> palindromeCount(s.size()); | |||
int l, r = -1; | |||
for (int i = 0; i < s.size(); i++) { | |||
int &p = palindromeCount[i]; | |||
if (i <= r) | |||
p = min(palindromeCount[l + r - i {{Changed|1=+ 1}}], r - i {{Changed|1=+ 1}}); | |||
while (0 <= i - p {{Changed|1=- 1}} && i + p < s.size() && s[i - p {{Changed|1=- 1}}] == s[i + p]) | |||
p++; | |||
if (i + p - 1 > r) { | |||
l = i - p; | |||
r = i + p - 1; | |||
} | } | ||
} | } | ||
return palindromeCount; | |||
} | } | ||
|} | |||
Версия от 16:12, 20 декабря 2022
vector<int> oddPalindromeCount(string &s) { vector<int> palindromeCount(s.size(), 1); int l, r = -1; for (int i = 0; i < s.size(); i++) { int &p = palindromeCount[i]; if (i <= r) p = min(palindromeCount[l + r - i], r - i); while (0 <= i - p && i + p < s.size() && s[i - p] == s[i + p]) p++; if (i + p - 1 > r) { l = i - p + 1; r = i + p - 1; } } return palindromeCount; } vector<vector<int>> manacher(string &s) { string t = "#"; for (char c : s) { t += c; t += '#'; } vector<int> palindromeCount = oddPalindromeCount(t); vector<vector<int>> res(2); for (int i = 0; i + 1 < palindromeCount.size(); i++) res[i % 2].push_back(palindromeCount[i] / 2); return res; } |
vector<int> evenPalindromeCount(string &s) { vector<int> palindromeCount(s.size()); int l, r = -1; for (int i = 0; i < s.size(); i++) { int &p = palindromeCount[i]; if (i <= r) p = min(palindromeCount[l + r - i + 1], r - i + 1); while (0 <= i - p - 1 && i + p < s.size() && s[i - p - 1] == s[i + p]) p++; if (i + p - 1 > r) { l = i - p; r = i + p - 1; } } return palindromeCount; } |