<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.234.40.81&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.234.40.81&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.234.40.81"/>
		<updated>2026-06-10T05:21:28Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B0%D1%81%D0%B0%D0%B8_%D0%B8_%D0%B4%D1%80.&amp;diff=71748</id>
		<title>Алгоритм Касаи и др.</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B0%D1%81%D0%B0%D0%B8_%D0%B8_%D0%B4%D1%80.&amp;diff=71748"/>
				<updated>2019-07-27T13:34:07Z</updated>
		
		<summary type="html">&lt;p&gt;178.234.40.81: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Касаи, Аримуры, Арикавы, Ли, Парка''' (англ. ''Kasai, Arimura, Arikawa, Lee, Park algorithm'') {{---}} алгоритм, позволяющий за линейное время вычислить длину наибольших общих префиксов (англ. ''longest common prefix'', ''LCP'') для всех соседних суффиксов строки, отсортированных в лексикографическом порядке.&lt;br /&gt;
&lt;br /&gt;
==Обозначения==&lt;br /&gt;
Введём следующие обозначения:&lt;br /&gt;
* &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; {{---}} данная строка.&lt;br /&gt;
* &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; {{---}} суффикс строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, начинающийся в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом символе.&lt;br /&gt;
* &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt; {{---}} [[Суффиксный массив | суффиксный массив]].&lt;br /&gt;
* &amp;lt;tex&amp;gt;Suf^{-1}&amp;lt;/tex&amp;gt; {{---}} массив, обратный суффиксному, который может быть получен немедленно, если задан массив &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;Suf[k] = i&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Suf^{-1}[i] = k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;LCP(S_{Suf[x]}, S_{Suf[z]})&amp;lt;/tex&amp;gt; {{---}} длина наибольшего общего префикса строк &amp;lt;tex&amp;gt;S_{Suf[x]}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_{Suf[z]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt;lcp[i]&amp;lt;/tex&amp;gt; {{---}} длина наибольшего общего префикса соседних строк &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;lcp[i] = LCP(S_{Suf[i-1]}, S_{Suf[i]})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Некоторые свойства LCP==&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id = fact1&lt;br /&gt;
|about= №1&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP(S_{Suf[y - 1]}, S_{Suf[y]}) \geqslant LCP(S_{Suf[x]},S_{Suf[z]}), x &amp;lt; y \leqslant z&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между двумя суффиксами {{---}} минимум &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; всех пар соседних суффиксов между ними в суффиксном массиве &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;LCP(S_{Suf[x]}, S_{Suf[z]}) = \min\limits_{x &amp;lt; y \leqslant z}LCP(S_{Suf[y - 1]},S_{Suf[y]})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Отсюда следует, что &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; пары соседних суффиксов в массиве &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt; больше или равно &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; пары суффиксов, окружающих их.&lt;br /&gt;
}}&lt;br /&gt;
Также заметим, что &amp;lt;tex&amp;gt;LCP(S_{Suf[x]}, S_{Suf[z]}) = \min\limits_{i = x + 1 \ldots z}lcp[i]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id = fact2&lt;br /&gt;
|about= №2&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;LCP(S_{Suf[x-1]} , S_{Suf[x]}) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;Suf^{-1}[Suf[x - 1] + 1] &amp;lt; Suf^{-1}[Suf[x] + 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим пару суффиксов, соседних в массиве &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;. Тогда если их значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; больше &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, то можно удалить первый символ этих суффиксов и их лексикографический порядок относительно друг друга сохранится. То есть строка &amp;lt;tex&amp;gt;S_{Suf[x] + 1}&amp;lt;/tex&amp;gt; будет идти следом за строкой &amp;lt;tex&amp;gt;S_{Suf[x-1] + 1}&amp;lt;/tex&amp;gt; и останется лексикографически больше нее.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id = fact3&lt;br /&gt;
|about= №3&lt;br /&gt;
|statement=Если &amp;lt;tex&amp;gt;LCP(S_{Suf[x-1]} , S_{Suf[x]} ) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;LCP(S_{Suf[x-1]+1} , S_{Suf[x]+1}) = LCP(S_{Suf[x-1]} , S_{Suf[x]} ) - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
В этом же случае, значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;S_{Suf[x-1]+1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_{Suf[x]+1}&amp;lt;/tex&amp;gt; на один меньше значения &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;S_{Suf[x-1]}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_{Suf[x]}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
[[Файл:kasai.png|400px|thumb|right|Пояснительная картинка к утверждениям 2 и 3]]&lt;br /&gt;
Рассмотрим строку &amp;lt;tex&amp;gt;S = aabaaca\$&amp;lt;/tex&amp;gt;. Её суффиксный массив:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;Suf[i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Распишем суффиксный массив по столбикам для удобного нахождения &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;Suf[i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || || &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; ||  || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || || &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; ||  || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; ||  || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; || &lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || || &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; ||  || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;&lt;br /&gt;
| || || &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; ||  ||  ||  ||  || &lt;br /&gt;
|}&lt;br /&gt;
Строим массив &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;tex&amp;gt;lcp[i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
| &amp;lt;tex&amp;gt;\bot&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Например &amp;lt;tex&amp;gt;lcp[3] = 2&amp;lt;/tex&amp;gt; {{---}} длина наибольшего общего префикса &amp;lt;tex&amp;gt;aa&amp;lt;/tex&amp;gt; суффиксов &amp;lt;tex&amp;gt;S_{Suf[2]} = aabaaca\$&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_{Suf[3]} = aaca\$&amp;lt;/tex&amp;gt;.&lt;br /&gt;
===Вспомогательные утверждения===&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим следующую задачу: рассчитать &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между суффиксом &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; и его соседним суффиксом в массиве &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;, при условии, что значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;S_{i-1}&amp;lt;/tex&amp;gt; и его соседним суффиксом известны. Для удобства записи пусть &amp;lt;tex&amp;gt;p=Suf^{-1}[i - 1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q = Suf^{-1}[i]&amp;lt;/tex&amp;gt;. Так же пусть &amp;lt;tex&amp;gt;j - 1 = Suf[p-1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;k = Suf[q - 1]&amp;lt;/tex&amp;gt;. Проще говоря, мы хотим посчитать &amp;lt;tex&amp;gt;lcp[q]&amp;lt;/tex&amp;gt;, когда задано &amp;lt;tex&amp;gt;lcp[p]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id = lemma&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;LCP(S_{j-1}, S_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;LCP(S_k,S_i) \geqslant LCP(S_j,S_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;LCP(S_{j-1},S_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, имеем &amp;lt;tex&amp;gt;Suf^{-1}[j] &amp;lt; Suf^{-1}[i]&amp;lt;/tex&amp;gt; из [[#fact2 | утверждения №2]]. Так как &amp;lt;tex&amp;gt;Suf^{-1}[j] \leqslant Suf^{-1}[k] = Suf^{-1}[i] - 1&amp;lt;/tex&amp;gt;, имеем &amp;lt;tex&amp;gt;LCP(S_{k} , S_{i}) \geqslant LCP(S_{j} , S_{i})&amp;lt;/tex&amp;gt; из [[#fact1 | утверждения №1]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;lcp[p] = LCP(S_{j-1}, S_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;lcp[q] = LCP(S_{k}, S_{i}) \geqslant lcp[p] - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP(S_{k}, S_{i}) \geqslant LCP(S_{j} , S_{i})&amp;lt;/tex&amp;gt; (по [[#lemma | лемме]]).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP(S_{j} , S_{i}) = LCP(S_{j-1}, S_{i-1}) - 1&amp;lt;/tex&amp;gt; (по [[#fact3 | утверждению №3]]).&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;LCP(S_{k}, S_{i}) \geqslant LCP(S_{j-1}, S_{i-1}) - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
Представим алгоритм &amp;lt;tex&amp;gt;\mathrm{buildLCP}&amp;lt;/tex&amp;gt; который вычисляет массив &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt;, зная суффиксный массив. Исходя из выше написанной теоремы, нам не нужно сравнивать все символы, когда мы вычисляем &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между суффиксом &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; и его соседним суффиксом в массиве &amp;lt;tex&amp;gt;Suf^{-1}&amp;lt;/tex&amp;gt;. Чтобы вычислить &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; всех соседних суффиксов в массиве &amp;lt;tex&amp;gt;Suf^{-1}&amp;lt;/tex&amp;gt; эффективно, будем рассматривать суффиксы по порядку начиная с &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и заканчивая &amp;lt;tex&amp;gt;S_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
   &lt;br /&gt;
===Псевдокод===&lt;br /&gt;
Алгоритм принимает на вход строку длиной &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, с добавленным специальным символом &amp;lt;tex&amp;gt;\$&amp;lt;/tex&amp;gt; и суффиксный массив этой строки, и возвращает массив &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 '''int[]''' buildLCP(str: '''string''', suf: '''int[]''')&lt;br /&gt;
    '''int''' n &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; str.length&lt;br /&gt;
    '''int[len]''' lcp&lt;br /&gt;
    '''int[len]''' pos  &amp;lt;font color=green&amp;gt; // pos[] {{---}} массив, обратный массиву suf &amp;lt;/font&amp;gt;&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       pos[suf[i]] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; i&lt;br /&gt;
    '''int''' k &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; 0&lt;br /&gt;
    '''for''' i = 0 '''to''' n - 1&lt;br /&gt;
       '''if''' k &amp;gt; 0&lt;br /&gt;
          k--  &lt;br /&gt;
       '''if''' pos[i] == n - 1&lt;br /&gt;
          lcp[n - 1] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; -1&lt;br /&gt;
          k &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; 0&lt;br /&gt;
          '''continue'''&lt;br /&gt;
       '''else'''&lt;br /&gt;
          '''int''' j &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; suf[pos[i] + 1]&lt;br /&gt;
          '''while''' max(i + k, j + k) &amp;lt; n '''and''' str[i + k] == str[j + k]&lt;br /&gt;
             k++&lt;br /&gt;
          lcp[pos[i]] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt; k&lt;br /&gt;
    '''return''' lcp&lt;br /&gt;
&lt;br /&gt;
===Асимптотика===&lt;br /&gt;
Таким образом, начиная проверять &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; для текущего суффикса не с первого символа, а с указанного, можно за линейное время построить &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt;. Покажем, что построение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; таким образом действительно требует &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени. Действительно, на каждой итерации текущее значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; может быть не более&lt;br /&gt;
чем на единицу меньше предыдущего. Таким образом, значения &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; в сумме могут увеличиться не более, чем на &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt; (с точностью до константы). Следовательно, алгоритм построит &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм цифровой сортировки суффиксов циклической строки]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [[wikipedia:ru:Алгоритм_Касаи | Википедия {{---}} Алгоритм Касаи]]&lt;br /&gt;
* [http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.118.8221  T.Kasai, G.Lee, H.Arimura, S.Arikawa, K.Park - Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Application]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Суффиксный массив]]&lt;/div&gt;</summary>
		<author><name>178.234.40.81</name></author>	</entry>

	</feed>