Изменения
→Поиск строки максимальной длины, ветвящейся влево и вправо v 1.0
}}
[[Файл:RightMergingSS.png|thumb|right|Суффиксное дерево для строки <tex>aabcabd</tex>]]
{{Теорема
|about=
|statement=
|proof=
<tex>\Leftarrow</tex>
*Предположим, что <tex>v</tex> различна влево. Значит, что существуют подстроки <tex>cs</tex> и <tex>ds</tex>.
*Пусть за первой подстрокой следует символ <tex>p</tex>. Если за второй подстрокой следует символ, <tex>\ne p</tex>, то <tex>s</tex> - строка, ветвящаяся вправо и влево.
*Так как у <tex>v</tex> есть два различных ребёнка, которые начинаются с различных символов <tex>p,q \ne \$</tex>, строка является ветвящейся вправо.
<tex>\Rightarrow</tex>
*Пусть строка <tex>s</tex> является ветвящейся вправо и влево.
*Тогда существуют подстроки <tex>csa</tex> и <tex>dsb</tex>.
*В суффиксном дереве существует вершина <tex>v</tex> соответствующая строке <tex>s</tex> (так как есть как минимум два суффикса, начинающиеся со строки <tex>s</tex>).
*У вершины <tex>v</tex>, есть как минимум два ребёнка, которые начинаются с символов <tex>a</tex> и <tex>b</tex> <tex>\Rightarrow</tex> счётчик вершины <tex>></tex> 2.
*Так же у вершины <tex>v</tex>, есть как минимум два ребёнка, у которых ''левый символ'' <tex>c</tex> и <tex>d</tex>, значит вершина <tex>v</tex> ''различна влево'' по определению.
}}
Будем хранить в вершинах суффиксного дерева следующую информацию: левый символ или флаг, означающий, что вершина различна влево.
Вторая часть алгоритма начинает с листов суффиксного дерева, записывая для них левый символ. Затем мы обрабатываем вершины снизу вверх. При обработке вершины <tex>v</tex> проверяются её дети, если хотя бы один из них различен влево, то записываем, что вершина <tex>v</tex> различна влево.
Если никто из детей не различен влево, то проверяем их символы, привязанные к вершинам детей.
Если все символы равны <tex>x</tex>, то запишем в <tex>v x</tex>, иначе запишем в <tex>v</tex>, что она различна влево.
Так как время проверки детей <tex>v</tex> пропорционально числу детей, время работы всего алгоритма - <tex>O(n)</tex>.
Далее соберём все строки удовлетворяющие условию теоремы и найдём среди них максимальную (так же этот алгоритм можно использовать для нахождения количества строк, ветвящихся влево и вправо).
Таким образом мы умеем искать строку максимальной длины, ветвящуюся влево и вправо за <tex>ST+O(N)</tex>.
==См. также==