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