42
правки
Изменения
→Алгоритм
== Алгоритм ==
# Найти все тандемные повторы, содержащиеся целиком в первой половине <tex>S</tex>( до позиции <tex>h</tex> включительно).# Найти все тандемные повторы, содержащиеся целиком во второй половине <tex>S</tex> ( после позиции <tex>h</tex>).
# Найти все тандемные повторы, в которых первая копия покрывает позицию <tex>h</tex>.
# Найти все тандемные повторы, в которых вторая копия покрывает позицию <tex>h</tex>.
|[[Файл: tandem.png|thumb|400px|center| Любая позиция между <tex>A</tex> и <tex>B</tex> включительно может быть начальной точкой тандемного повтора длины <tex>2l</tex>. Как указывается в шаге 4, длины <tex>l_1</tex> и <tex>l_2</tex> обе положительны, поэтому подынтервал этих начальных точек определяет тандемные повторы, в которых первая копия покрывает <tex>h</tex>.]]
|}
число <tex>l</tex>.
# Положить <tex>q:=h + l</tex>.
# Вычислить наибольшее общее продолжение ( в прямом направлении) из позиций <tex>h</tex> и <tex>q</tex>. Пусть <tex>l_1</tex> — длина этого продолжения.# Вычислить наибольшее общее продолжение ( в обратном направлении) из позиций <tex>h - 1</tex> и <tex>q - 1</tex>. Пусть <tex>l_2</tex> — длина этого продолжения.
# Тандемный повтор длины <tex>2l</tex>, первая копия которого покрывает позицию <tex>h</tex>, существует в том и только том случае, если <tex>l_1 + l_2 \geqslant l</tex> и обе длины <tex>l_1</tex> и <tex>l_2</tex> положительны. Более того, если такой тандемный повтор длины <tex>2l</tex> существует, то он может начинаться в любой позиции от <tex>\max ( h - l_2, h — l + 1)</tex> до <tex>\min ( h + l_1 — l, h)</tex> включительно. Вторая копия повтора начинается в <tex>l</tex> позициях вправо. Вывести каждую из этих начальных позиций вместе с длиной <tex>2l</tex>.
=== Корректность ===
== Теорема ==
{{Лемма