Алгоритм Манакера — различия между версиями
Rthakohov (обсуждение | вклад) |
Rthakohov (обсуждение | вклад) |
||
| Строка 10: | Строка 10: | ||
<font color=green>// <tex>s</tex> {{---}} исходная строка</font> | <font color=green>// <tex>s</tex> {{---}} исходная строка</font> | ||
<font color=green>// <tex>d1, d2</tex> {{---}} массивы для записи ответа</font> | <font color=green>// <tex>d1, d2</tex> {{---}} массивы для записи ответа</font> | ||
| − | + | '''for''' i = 1 '''to''' n | |
| − | ''' | + | d1[i] = 1 |
| + | '''while''' i - d1[i] > 0 '''and''' i + d1[i] <= n '''and''' s[i - d1[i]] == s[i + d1[i]] | ||
| + | d1[i]++ | ||
| + | d2[i] = 0 | ||
| + | '''while''' i - d2[i] - 1 > 0 '''and''' i + d2[i] <= n '''and''' s[i - d2[i] - 1] == s[i + d2[i]] | ||
| + | d2[i]++ | ||
Версия 11:38, 10 марта 2016
| Задача: |
| Пусть дана строка . Требуется найти - длина наибольшего палиндрома нечетной длины с центром в позиции и - аналогично для палиндромов четной длины для всех от 1 до . |
Наивный алгоритм
Идея
Опишем сначала наивный алгоритм решения задачи. Чтобы посчитать ответ для позиции , будем на каждом шаге увеличивать длину палиндрома с центром в и убеждаться, что рассматриваемая строка не перестала быть палиндромом, либо не произошел выход за границы массива. Очевидно, что такой алгоритм будет работать за
Псевдокод
// — исходная строка // — массивы для записи ответа for i = 1 to n d1[i] = 1 while i - d1[i] > 0 and i + d1[i] <= n and s[i - d1[i]] == s[i + d1[i]] d1[i]++ d2[i] = 0 while i - d2[i] - 1 > 0 and i + d2[i] <= n and s[i - d2[i] - 1] == s[i + d2[i]] d2[i]++