Алгоритм Манакера — различия между версиями
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]++