Дерево палиндромов — различия между версиями
(→Описание структуры) |
(→Описание структуры) |
||
Строка 8: | Строка 8: | ||
[[Файл:palindrome_tree_nodes.png|Пример четырех вершин дерева палиндромов|border]] | [[Файл:palindrome_tree_nodes.png|Пример четырех вершин дерева палиндромов|border]] | ||
− | Ребра дерева палиндромов ориентированные и помечены символами. Ребро с символом <tex>x</tex> из вершины <tex>u</tex> в вершину <tex>v</tex> означает, что <tex>v.value=x+u.value+x</tex>. Тут <tex> | + | Ребра дерева палиндромов ориентированные и помечены символами. Ребро с символом <tex>x</tex> из вершины <tex>u</tex> в вершину <tex>v</tex> означает, что <tex>v.value=x+u.value+x</tex>. Тут <tex><<+>></tex> означает конкатенацию строк. |
[[Файл:palindrome_tree_edge.png|В данном примере мы получаем палиндром aba добавлением символа a к обоим сторонам палиндрома b|border]] | [[Файл:palindrome_tree_edge.png|В данном примере мы получаем палиндром aba добавлением символа a к обоим сторонам палиндрома b|border]] |
Версия 18:44, 6 июня 2016
Дерево палиндромов — структура данных, позволяющая решить некоторые интересные задачи на палиндромы.
Эту структуру данных придумал Михаил Рубинчик и рассказал ее на летних сборах в Петрозаводске в 2014 году.
Содержание
Описание структуры
Дерево палиндромов состоит из вершин. Каждая вершина соответствует палиндрому. Через
Ребра дерева палиндромов ориентированные и помечены символами. Ребро с символом
из вершины в вершину означает, что . Тут означает конкатенацию строк.Также в дереве палиндромов присутствуют суффиксные ссылки. Суффиксная ссылка из вершины
Построение
Реализация
Название структуры данных выбрано не совсем удачно, т.к. на самом деле она представляет из себя два дерева, однако суффиксные ссылки могут вести как в то же, так и в другое дерево. Это сделано для удобства реализации. Также в целях экономии памяти мы будем хранить для каждой вершины не строки, а позицию в исходной строке (
) и размер палиндрома ( ).Итак, у нас будет два дерева. Одно дерево для палиндромов четной длины, другое {---} для палиндромов нечетной длины. Каждое дерево будет иметь фиктивный корень. Обозначим корни четного и нечетного дерева соответственно
и .будет соответствовать фиктивному палиндрому длины -1. Это нужно для того, чтобы не обрабатывать отдельно случай добавления палиндрома длины 1. Теперь каждый раз при добавлении новой вершины к вершине мы будем просто указывать ее длину равной .