From c24689124adfda7e1fed49e2c446af39f9d9739f Mon Sep 17 00:00:00 2001 From: Kamran Pulatov <84636918+WrldEngine@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:31:27 +0500 Subject: [PATCH] refactor: Manacher's algorithm for even-length palindromes & add implementation without odd-even counting --- .../russian/cs/string-searching/manacher.md | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/content/russian/cs/string-searching/manacher.md b/content/russian/cs/string-searching/manacher.md index 16d32ccb..1177d3c6 100644 --- a/content/russian/cs/string-searching/manacher.md +++ b/content/russian/cs/string-searching/manacher.md @@ -24,9 +24,9 @@ vector pal_array(string s) { for(int i = 1; i <= n; i++) while (s[i - t[i - 1]] == s[i + t[i - 1]]) - r[i-1]++; + t[i-1]++; - return r; + return t; } ``` @@ -38,7 +38,8 @@ vector pal_array(string s) { vector manacher_odd(string s) { int n = (int) s.size(); - vector d(n, 1); + s = "$" + s + "^"; + vector d(n + 2, 1); int l = 0, r = 0; for (int i = 1; i < n; i++) { if (i < r) @@ -76,7 +77,24 @@ vector manacher_even(string s) { Также можно было не писать отдельно две реализации, а воспользоваться следующим трюком — сделать замену: $$ -S = s_1 s_2 \dots s_n \to S^* = s_1 \# s_2 \# \dots \# s_n +S = s_1 s_2 \dots s_n \to S^* = \# s_1 \# s_2 \# \dots \# s_n \# $$ -Теперь нечётные палиндромы с центром в $s_i$ соответствуют нечётным палиндромам исходной строки, а нечётные палиндромы с центром в `#` — чётным. +Теперь нечётные палиндромы с центром в $s_i$ соответствуют нечётным палиндромам исходной строки, а нечётные палиндромы с центром в `#` — чётным: + +```c++ +vector manacher(string s) { + int n = (int)s.size(); + + string new_s; + new_s.reserve(n * 2 + 1); + + new_s.push_back('#'); + for (int i = 0; i < n; i++) { + new_s.push_back(s[i]); + new_s.push_back('#'); + } + + return manacher_odd(new_s); +} +```