Алгоритм Манакера
Перейти к навигации
Перейти к поиску
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 = (i > r ? 1 : min(odd[l + r - i], r - i)); while (i - k >= 0 && i + k < n && s[i - k] == s[i + k]) k++; odd[i] = k; if (i + k - 1 > r) { l = i - k + 1; r = i + k - 1; } } } void evenPalindromesCount() { int l = 0, r = -1; for (int i = 0; i < n; i++) { int k = (i > r ? 0 : min(even[l + r - i - 1], r - i)); while (i - k >= 0 && i + k + 1 < n && s[i - k] == s[i + k + 1]) k++; even[i] = k; if (i + k > r) { l = i - k + 1; r = i + k; } } }
Ссылки
Теория:
Код:
Задачи: