<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2</id>
	<title>Суффиксный массив - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;action=history"/>
	<updated>2026-04-09T14:43:02Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=4507&amp;oldid=prev</id>
		<title>Patarakin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=4507&amp;oldid=prev"/>
		<updated>2022-10-19T07:30:42Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 10:30, 19 октября 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key digida:diff:1.41:old-4506:rev-4507 --&gt;
&lt;/table&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=4506&amp;oldid=prev</id>
		<title>ru_wikipedia&gt;Ok822: Исправлена ошибка в структуре предложения</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=4506&amp;oldid=prev"/>
		<updated>2022-04-05T16:39:14Z</updated>

		<summary type="html">&lt;p&gt;Исправлена ошибка в структуре предложения&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Суффиксный массив&amp;#039;&amp;#039;&amp;#039; — [[Лексикографический порядок|лексикографически]] [[Алгоритм сортировки|отсортированный]] [[Массив (программирование)|массив]] всех [[Суффикс (информатика)|суффиксов]] [[Строковый тип|строки]]. Эта [[структура данных]] была разработана [[Майерс, Юджин|Юджином Майерсом]] и [[Уди Манбер]]ом как более экономная альтернатива [[суффиксное дерево|суффиксному дереву]] с точки зрения необходимой памяти. Она часто применяется там, где необходим быстрый поиск подстрок, например в [[Преобразование Барроуза — Уилера|преобразовании Барроуза — Уилера]] (BWT), а также в качестве структуры данных в [[поисковый индекс|поисковом индексе]].&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим строку «abracadabra» длиной 11 символов.&lt;br /&gt;
&lt;br /&gt;
 a  b  r  a  c  a  d  a  b  r  a&lt;br /&gt;
 1  2  3  4  5  6  7  8  9  10 11&lt;br /&gt;
&lt;br /&gt;
Отсортированный список её суффиксов:&lt;br /&gt;
&lt;br /&gt;
 a&lt;br /&gt;
 abra&lt;br /&gt;
 abracadabra&lt;br /&gt;
 acadabra&lt;br /&gt;
 adabra&lt;br /&gt;
 bra&lt;br /&gt;
 bracadabra&lt;br /&gt;
 cadabra&lt;br /&gt;
 dabra&lt;br /&gt;
 ra&lt;br /&gt;
 racadabra&lt;br /&gt;
&lt;br /&gt;
Суффиксный массив этой строки — {11,8,1,4,6,9,2,5,7,10,3}, потому что суффикс «a» начинается с 11-го знака, суффикс «abra» — с 8-го, и так далее, вплоть до последнего суффикса «racadabra», который начинается с третьего символа исходного слова.&lt;br /&gt;
&lt;br /&gt;
Теперь с помощью этого массива можно легко найти все подстроки. Например, если нужно найти подстроку «ab», достаточно найти все суффиксы, которые начинаются на «ab». За счёт сортировки по алфавиту они находятся рядом друг с другом. Используя [[бинарный поиск]], мы находим 2-й и 3-й суффиксы «abra» и «abracadabra», которым соответствуют 2-й и 3-й элемент суффиксного массива (8 и 1). Это означает, что искомая подстрока «ab» встречается на первом и восьмом символе в исходном слове.&lt;br /&gt;
&lt;br /&gt;
== Построение ==&lt;br /&gt;
Суффиксный массив можно построить как с помощью суффиксного дерева, так и без него, дополнив строку до циклической длины степени двойки, и применив к нему конкретный алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Через суффиксное дерево ===&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
# Строим суффиксное дерево для строки T$. Где T — текст.&lt;br /&gt;
# В этом суффиксном дереве запускаем поиск в глубину с приоритетом выбора лексиграфически минимальных рёбер.&lt;br /&gt;
# Во время поиска считаем, что $ (сентинел) лексикографически наименьший символ.&lt;br /&gt;
# Приход в лист достижение некоторого ещё не рассмотренного в данный момент лексикографически наименьшего суффикса, значение в листе которого, начальный индекс в, нужно записать в текущую ячейку суффиксного массива.&lt;br /&gt;
# Так получается суффиксный массив для всего текста.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Сложность построения — &amp;lt;math&amp;gt;O(|T|)&amp;lt;/math&amp;gt;, линия включает в себя построение суффиксного дерева и обход в глубину.&lt;br /&gt;
&lt;br /&gt;
== Поиск ==&lt;br /&gt;
Поиск в суффиксном массиве можно осуществить через бинарный поиск. Его худшая оценка &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;. Но можно ускорить до &amp;lt;math&amp;gt;O(n + \log_2{m})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Наивный бинарный поиск ===&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
* Идея поиска в том, что если образец встречается в тексте, то все суффиксы, начинающиеся с &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; в суффиксном массиве &amp;lt;math&amp;gt;Pos&amp;lt;/math&amp;gt; будет располагаться рядом.&lt;br /&gt;
* Запускаем двоичный поиск &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; в суффиксном массиве &amp;lt;math&amp;gt;Pos&amp;lt;/math&amp;gt; и находим такой наименьший индекс &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Pos(i-1)&amp;lt;/math&amp;gt; не начинается с &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и наибольший индекс &amp;lt;math&amp;gt;i&amp;#039;&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;Pos(i&amp;#039;+1)&amp;lt;/math&amp;gt; тоже не начинается с &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Тогда образец входит в позициях &amp;lt;math&amp;gt;Pos(i)&amp;lt;/math&amp;gt; до &amp;lt;math&amp;gt;Pos(i&amp;#039;)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Если существует много префиксов паттерна, то оценка работы падает до &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Простое ускорение ===&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
* &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; — границы интервала поиска. На начале &amp;lt;math&amp;gt;L = 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;R = m&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Запоминаем длину префиксов &amp;lt;math&amp;gt;Pos(L)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;Pos(R)&amp;lt;/math&amp;gt;, совпадающих с префиксом &amp;lt;math&amp;gt;P: l, r&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;mlr = min(l,r)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* При очередном сравнении в позиции &amp;lt;math&amp;gt;M = \frac{L + R}{2}&amp;lt;/math&amp;gt; начинаем обрабатывать символы не с первой позиции, а с &amp;lt;math&amp;gt;mlr(l,r) + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Обычно время работы &amp;lt;math&amp;gt;O(n + \log{m})&amp;lt;/math&amp;gt;, но худшее время работы всё ещё &amp;lt;math&amp;gt;O(n\log{m})&amp;lt;/math&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ускорение через LCP ===&lt;br /&gt;
Наибольший общий префикс ({{lang-en|Largest Common Prefix}}) — для двух строк &amp;lt;math&amp;gt;S_1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;S_2&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;LCP(S_1, S_2)&amp;lt;/math&amp;gt; — длина наибольшего совпадающего префикса.&lt;br /&gt;
&lt;br /&gt;
В этом алгоритме будем считать, что &amp;lt;math&amp;gt;LCP&amp;lt;/math&amp;gt; для любых двух суффиксов вычисляется за &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;. Функция вычисляется на этапе препроцессинга при построении дерева. Также верно утверждение: &amp;lt;math&amp;gt;LCP(i, j) = min(LCP(k, k + 1)), i\leq k &amp;lt; j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Благодаря этой функции можно оптимизировать бинарный поиск по суффиксному массиву.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Лемма&amp;#039;&amp;#039;&amp;#039;: Если на левой и правой границе (&amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; соответственно индексы суффиксного массива) совпадают первые &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; символов суффикса, то столько же символов будет совпадать для всех суффиксов на отрезке &amp;lt;math&amp;gt;[L,R]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|&lt;br /&gt;
# &amp;lt;math&amp;gt;L = 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;R = |T|&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;l = LCP(P, L)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;r = LCP(P, R)&amp;lt;/math&amp;gt;. Дальше возможны следующие случаи&lt;br /&gt;
## &amp;lt;math&amp;gt;l = r&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Сравниваем суффикс в &amp;lt;math&amp;gt;M = \frac{L + R}{2}&amp;lt;/math&amp;gt; с паттерном с позиции &amp;lt;math&amp;gt;l + 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Суффикс лексикографически больше или равен &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; и на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; позиции в суффиксе произошло несовпадение (если произошло лексикографическое совпадение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, то считаем &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; равным &amp;lt;math&amp;gt;|P|+1&amp;lt;/math&amp;gt;), то меняем границы поиска: &amp;lt;math&amp;gt;L = M, R = R, l = i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
### Иначе меняем границы так: &amp;lt;math&amp;gt;L = L, R = M, r = i - 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
## &amp;lt;math&amp;gt;l &amp;gt; r&amp;lt;/math&amp;gt;. Проверяем &amp;lt;math&amp;gt;LCP(L, M), M = \frac{L+R}{2}&amp;lt;/math&amp;gt;.&lt;br /&gt;
### &amp;lt;math&amp;gt;LCP(L, M) &amp;gt; l&amp;lt;/math&amp;gt;. В таком случае после позиции &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; в суффиксе на позиции &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; следует некоторое количество тех же самых символов, что и в &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, которые не совпадают с паттерном (если бы совпадали, то &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; было бы больше). Значит, нужно изменить границы следующим образом: &amp;lt;math&amp;gt;L = M,R = R, l = l&amp;lt;/math&amp;gt;.&lt;br /&gt;
### &amp;lt;math&amp;gt;LCP(L, M) &amp;lt; l&amp;lt;/math&amp;gt;, это значит, что после позиции &amp;lt;math&amp;gt;LCP(L, M)&amp;lt;/math&amp;gt; в суффиксе на позиции &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; следует несовпадение с некоторыми символами префикса &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt;, причём в &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; содержится большая часть совпадения с паттерном — значит в отрезке &amp;lt;math&amp;gt;[M, R]&amp;lt;/math&amp;gt; точно не найдется вхождений паттерна. Изменить границы нужно следующим образом: &amp;lt;math&amp;gt;L = L, R = M, r = LCP(L, M)&amp;lt;/math&amp;gt;.&lt;br /&gt;
### &amp;lt;math&amp;gt;LCP(L,M)=l&amp;lt;/math&amp;gt;﻿, это значит, что на отрезке &amp;lt;math&amp;gt;[L,M]&amp;lt;/math&amp;gt;﻿ во всех суффиксах совпадают первые &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; символов, и нельзя сразу сказать, в какой подотрезок нужно пойти. Для разрешения этого необходимо сравнить с паттерном &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;﻿ следующие за позицией &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; символы в суффиксе &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;﻿. Если &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; лексикографически меньше или равно &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;﻿ и на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;﻿-ой позиции произошло несовпадение (если произошло лексикографическое совпадение &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;﻿ и &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;﻿, то считаем &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; равным &amp;lt;math&amp;gt;|P|+1&amp;lt;/math&amp;gt;), то изменяем границы так: &amp;lt;math&amp;gt;L=M&amp;lt;/math&amp;gt;﻿, &amp;lt;math&amp;gt;R=R&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;l = i - 1&amp;lt;/math&amp;gt;﻿; иначе (&amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; лексикографически больше): &amp;lt;math&amp;gt;R=M&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;L=L&amp;lt;/math&amp;gt;,&amp;lt;math&amp;gt;r = i - 1&amp;lt;/math&amp;gt;﻿.&lt;br /&gt;
## &amp;lt;math&amp;gt;l &amp;lt; r&amp;lt;/math&amp;gt;. Проверяем &amp;lt;math&amp;gt;LCP(R, M), M = \frac{L+R}{2}&amp;lt;/math&amp;gt; и сравниваем с &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; как на прошлом шаге, но &amp;lt;math&amp;gt;L&amp;lt;/math&amp;gt; меняем на &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Алгоритм работает, пока &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; не станут равными &amp;lt;math&amp;gt;|P|&amp;lt;/math&amp;gt;. Это значит, что есть отрезок совпадения. Если не выполняется инвариант &amp;lt;math&amp;gt;L &amp;lt; P &amp;lt; R&amp;lt;/math&amp;gt;, то паттерна как подстроки в тексте нет.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Такое сверхускорение даёт время &amp;lt;math&amp;gt;O(|P|+\log_2{|T|})&amp;lt;/math&amp;gt;, так как выполняется &amp;lt;math&amp;gt;\log_2{|T|}&amp;lt;/math&amp;gt; итераций по суффиксному массиву.&lt;br /&gt;
&lt;br /&gt;
== Связанные алгоритмы ==&lt;br /&gt;
* [[Алгоритм Касаи]] построения массива наибольших общих префиксов.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Суффиксное дерево]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://e-maxx.ru/algo/suffix_array Суффиксный массив. Алгоритм построения и применения]&lt;br /&gt;
* [http://compression.ru/download/articles/bwt/khmelev_2003_bwt.html#tth_sEc3 Суффиксный массив и BWT]&lt;br /&gt;
* [https://web.archive.org/web/20100820195150/http://rain.ifmo.ru/cat/view.php/vis/strings/suffix-arrays-2005 Визуализатор алгоритма] (требуется [[Java]])&lt;br /&gt;
* [https://web.archive.org/web/20071223021534/http://rain.ifmo.ru/cat/view.php/theory/unsorted/suffix-arrays-2005 Дискретная математика: алгоритмы. Суффиксные массивы]&lt;br /&gt;
* [http://sites.google.com/site/indy256/algo/suffix_array Реализация суффиксного массива на Java]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор         = {{nobr|Гасфилд Д.}}&lt;br /&gt;
 |заглавие      = Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология&lt;br /&gt;
 |ссылка        = &lt;br /&gt;
 |ответственный = Пер. с англ. И. В. Романовского&lt;br /&gt;
 |издание       = 2-е изд&lt;br /&gt;
 |место         = СПб.&lt;br /&gt;
 |издательство  = Невский Диалект&lt;br /&gt;
 |год           = 2003&lt;br /&gt;
 |страниц       = 654&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
 |автор         = {{nobr|Смит Б.}}&lt;br /&gt;
 |заглавие      = Методы и алгоритмы вычислений на строках&lt;br /&gt;
 |оригинал    = Computing Patterns in Strings&lt;br /&gt;
 |ссылка        = &lt;br /&gt;
 |ответственный = &lt;br /&gt;
 |издание       = &lt;br /&gt;
 |место         = М.&lt;br /&gt;
 |издательство  = Вильямс&lt;br /&gt;
 |год           = 2006&lt;br /&gt;
 |страниц       = 496&lt;br /&gt;
 |isbn  = 5-8459-1081-1, 0-201-39839-7&lt;br /&gt;
}}&lt;br /&gt;
{{Строки}}&lt;br /&gt;
[[Категория:Строковые алгоритмы]]&lt;br /&gt;
[[Категория:Поиск подстроки]]&lt;br /&gt;
[[Категория:Структуры данных]]&lt;/div&gt;</summary>
		<author><name>ru_wikipedia&gt;Ok822</name></author>
	</entry>
</feed>