<?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%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%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%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;action=history"/>
	<updated>2026-05-20T22:11:37Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4590&amp;oldid=prev</id>
		<title>Patarakin: /* Структура дерева */</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4590&amp;oldid=prev"/>
		<updated>2022-10-19T08:41:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Структура дерева&lt;/span&gt;&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;Версия от 11:41, 19 октября 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l17&quot;&gt;Строка 17:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Структура дерева ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Структура дерева ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;В обозначениях выше, &#039;&#039;дерево палиндромов&#039;&#039; строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — это [[ориентированный граф]], каждая [[Вершина (теория графов)|вершина]] которого соответствует некоторому уникальному подпалиндрому строки и отождествляется с ним. Если у строки есть подпалиндромы &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ctc&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — некоторый символ [[Алфавит (формальный язык))|алфавита]], то в дереве палиндромов есть [[Дуга (теория графов)|дуга]], помеченная символом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, из вершины, соответствующей &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, в вершину, соответствующую &amp;lt;math&amp;gt;ctc&amp;lt;/math&amp;gt;. В таком графе у любой вершины может быть только одна входящая дуга. Для удобства также вводятся две служебные вершины, которые соответствуют палиндромам длины &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; ([[пустая строка]]) и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; («мнимая» строка) соответственно. Дуги из пустой строки ведут в вершины, соответствующие палиндромам вида &amp;lt;math&amp;gt;cc&amp;lt;/math&amp;gt;, а из «мнимой строки» — в вершины, соответствующие палиндромам вида &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (то есть состоящим из единственного символа). Вершина называется &#039;&#039;чётной&#039;&#039;, если ей соответствует палиндром чётной длины, и &#039;&#039;нечётной&#039;&#039; в противном случае. Из определения следует, что дуги в дереве палиндромов проходят только между вершинами с одинаковой чётностью. &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;С точки зрения префиксных деревьев данная структура может быть описана следующим образом&amp;lt;ref name=&quot;:0&quot;&amp;gt;{{Sfn-текст|Rubinchik, Shur|2018|pp=2—6}}&amp;lt;/ref&amp;gt;:&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;В обозначениях выше, &#039;&#039;дерево палиндромов&#039;&#039; строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — это [[ориентированный граф]], каждая [[Вершина (теория графов)|вершина]] которого соответствует некоторому уникальному подпалиндрому строки и отождествляется с ним. Если у строки есть подпалиндромы &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ctc&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — некоторый символ [[Алфавит (формальный язык))|алфавита]], то в дереве палиндромов есть [[Дуга (теория графов)|дуга]], помеченная символом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, из вершины, соответствующей &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, в вершину, соответствующую &amp;lt;math&amp;gt;ctc&amp;lt;/math&amp;gt;. В таком графе у любой вершины может быть только одна входящая дуга. Для удобства также вводятся две служебные вершины, которые соответствуют палиндромам длины &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; ([[пустая строка]]) и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; («мнимая» строка) соответственно. Дуги из пустой строки ведут в вершины, соответствующие палиндромам вида &amp;lt;math&amp;gt;cc&amp;lt;/math&amp;gt;, а из «мнимой строки» — в вершины, соответствующие палиндромам вида &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (то есть состоящим из единственного символа). Вершина называется &#039;&#039;чётной&#039;&#039;, если ей соответствует палиндром чётной длины, и &#039;&#039;нечётной&#039;&#039; в противном случае. Из определения следует, что дуги в дереве палиндромов проходят только между вершинами с одинаковой чётностью.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Вычислительная сложность ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== Вычислительная сложность ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Вычислительная сложность|Сложность]] алгоритма может варьировать в зависимости от структур данных, в которых хранится таблица переходов в дереве.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Вычислительная сложность|Сложность]] алгоритма может варьировать в зависимости от структур данных, в которых хранится таблица переходов в дереве.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Применения ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Применения ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Дерево палиндромов даёт множество возможных применений для получения теоретически быстрых и практически легко реализуемых алгоритмов для решения ряда комбинаторных задач в программировании и математической кибернетике&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Дерево палиндромов даёт множество возможных применений для получения теоретически быстрых и практически легко реализуемых алгоритмов для решения ряда комбинаторных задач в программировании и математической кибернетике&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Структуры данных]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Категория:Структуры данных]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4589&amp;oldid=prev</id>
		<title>Patarakin в 08:40, 19 октября 2022</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4589&amp;oldid=prev"/>
		<updated>2022-10-19T08:40:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;amp;diff=4589&amp;amp;oldid=4571&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4571&amp;oldid=prev</id>
		<title>Patarakin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4571&amp;oldid=prev"/>
		<updated>2022-10-19T07:30:54Z</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-4570:rev-4571 --&gt;
&lt;/table&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4570&amp;oldid=prev</id>
		<title>ru_wikipedia&gt;Adamant.pwn: /* Применения */ оформление сноски через sfn, ссылка на квант нерелевантна</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D0%BF%D0%B0%D0%BB%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%BE%D0%B2&amp;diff=4570&amp;oldid=prev"/>
		<updated>2020-11-08T21:47:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Применения: &lt;/span&gt; оформление сноски через sfn, ссылка на квант нерелевантна&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Структура данных&lt;br /&gt;
| изобретена = [[2015]]&lt;br /&gt;
| построение худшее = &amp;lt;math&amp;gt;O(n \log \sigma)&amp;lt;/math&amp;gt;&lt;br /&gt;
| память худшая = &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Дерево палиндромов&amp;#039;&amp;#039;&amp;#039; ({{Lang-en|palindromic tree}}, также &amp;#039;&amp;#039;овердрево&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Sfn-текст|Рубинчик|2016|страницы=6—9}}&amp;lt;/ref&amp;gt;, {{Lang-en|eertree}}) — [[структура данных]], предназначенная для хранения и обработки [[палиндром]]ных подстрок некоторой [[Строка (программирование)|строки]]. Была предложена учёными из [[Уральский федеральный университет|Уральского федерального университета]] Михаилом Рубинчиком и Арсением Шуром в 2015 году. Представляет собой два [[Префиксное дерево|префиксных дерева]], собранных из правых «половинок» палиндромных подстрок чётной и нечётной длины соответственно. Структура [[О-нотация|занимает]] &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; памяти и может быть построена за время &amp;lt;math&amp;gt;O(n \log \sigma)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — длина строки, а &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; — количество различных символов в ней. С помощью дерева палиндромов можно эффективно решать такие задачи, как подсчёт числа различных палиндромных подстрок, поиск разбиения строки на наименьшее число палиндромов, проверка подстроки на то, является ли она палиндромом, и другие.&lt;br /&gt;
&lt;br /&gt;
== Обозначения ==&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;S=s_1 s_2 \dots s_n&amp;lt;/math&amp;gt; — некоторая строка, а &amp;lt;math&amp;gt;S^R = s_n s_{n-1} \dots s_1&amp;lt;/math&amp;gt; — &amp;#039;&amp;#039;обращённая&amp;#039;&amp;#039; строка &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;. При описании дерева палиндромов строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; используются следующие обозначения&amp;lt;ref&amp;gt;{{Sfn-текст|Rubinchik, Shur|2018|pp=1—2}}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Строка &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; называется &amp;#039;&amp;#039;палиндромом&amp;#039;&amp;#039;, если она читается одинаково слева направо и справа налево, то есть если &amp;lt;math&amp;gt;S = S^R&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;Подстрокой&amp;#039;&amp;#039; называют непрерывную [[подпоследовательность]] строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; и обозначают &amp;lt;math&amp;gt;S_{l,r} =s_l s_{l+1} \dots s_r&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* В частности, подстрока, у которой &amp;lt;math&amp;gt;l=1&amp;lt;/math&amp;gt;, называется &amp;#039;&amp;#039;префиксом&amp;#039;&amp;#039; строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, а подстрока, у которой &amp;lt;math&amp;gt;r=n&amp;lt;/math&amp;gt;, — &amp;#039;&amp;#039;суффиксом&amp;#039;&amp;#039; строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Палиндромной подстрокой (&amp;#039;&amp;#039;подпалиндромом&amp;#039;&amp;#039;) называют подстроку &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, которая является палиндромом. Если эта подстрока также является префиксом или суффиксом строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то её называют &amp;#039;&amp;#039;префикс-&amp;#039;&amp;#039; или &amp;#039;&amp;#039;суффикс-палиндромом&amp;#039;&amp;#039; соответственно.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;[[Префиксное дерево|Префиксным деревом]]&amp;#039;&amp;#039; называют корневое ориентированное [[Дерево (теория графов)|дерево]], дуги которого помечены [[Символьный тип|символами]] таким образом, что из любой [[Вершина (теория графов)|вершины]] &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; этого дерева исходит не больше одной [[Дуга (теория графов)|дуги]], помеченной данным символом.&lt;br /&gt;
&lt;br /&gt;
* Каждой вершине префиксного дерева &amp;#039;&amp;#039;соответствует&amp;#039;&amp;#039; строка, равная конкатенации символов на пути из корня дерева в эту вершину.&lt;br /&gt;
&lt;br /&gt;
== Структура дерева ==&lt;br /&gt;
В обозначениях выше, &amp;#039;&amp;#039;дерево палиндромов&amp;#039;&amp;#039; строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; — это [[ориентированный граф]], каждая [[Вершина (теория графов)|вершина]] которого соответствует некоторому уникальному подпалиндрому строки и отождествляется с ним. Если у строки есть подпалиндромы &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ctc&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; — некоторый символ [[Алфавит (формальный язык))|алфавита]], то в дереве палиндромов есть [[Дуга (теория графов)|дуга]], помеченная символом &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, из вершины, соответствующей &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, в вершину, соответствующую &amp;lt;math&amp;gt;ctc&amp;lt;/math&amp;gt;. В таком графе у любой вершины может быть только одна входящая дуга. Для удобства также вводятся две служебные вершины, которые соответствуют палиндромам длины &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; ([[пустая строка]]) и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; («мнимая» строка) соответственно. Дуги из пустой строки ведут в вершины, соответствующие палиндромам вида &amp;lt;math&amp;gt;cc&amp;lt;/math&amp;gt;, а из «мнимой строки» — в вершины, соответствующие палиндромам вида &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; (то есть состоящим из единственного символа). Вершина называется &amp;#039;&amp;#039;чётной&amp;#039;&amp;#039;, если ей соответствует палиндром чётной длины, и &amp;#039;&amp;#039;нечётной&amp;#039;&amp;#039; в противном случае. Из определения следует, что дуги в дереве палиндромов проходят только между вершинами с одинаковой чётностью. С точки зрения префиксных деревьев данная структура может быть описана следующим образом&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;{{Sfn-текст|Rubinchik, Shur|2018|pp=2—6}}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{{Теорема|Вершины и дуги дерева палиндромов образуют два префиксных дерева, корни которых находятся в вершинах, задающих пустую и «мнимую» строки соответственно. При этом первое префиксное дерево составлено из правых половин подпалиндромов чётной длины, а второе — нечётной.}}&lt;br /&gt;
&lt;br /&gt;
Количество вершин в дереве палиндромов не превосходит &amp;lt;math&amp;gt;n+2&amp;lt;/math&amp;gt;, что является прямым следствием следующей леммы&amp;lt;ref name=&amp;quot;:1&amp;quot;&amp;gt;{{Sfn-текст|Watanabe et al.|2019|pp=432—434}}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
{{Теорема|У строки &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; может быть не больше &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; различных непустых палиндромных подстрок. Более того, после приписывания некоторого символа &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; в конец строки количество &amp;#039;&amp;#039;различных&amp;#039;&amp;#039; подпалиндромов данной строки может увеличиться не больше, чем на &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.}}&lt;br /&gt;
{{Доказательство|Данное утверждение следует из следующих фактов:&lt;br /&gt;
# Если палиндром &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; — суффикс палиндрома &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;, то он также является его префиксом;&lt;br /&gt;
# Если палиндромы &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; — суффиксы строки &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;|u| &amp;lt; |v|&amp;lt;/math&amp;gt;, то &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; встречается в &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; хотя бы два раза (как префикс и как суффикс &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;);&lt;br /&gt;
# У любой строки &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; может быть не больше одного уникального (встречающегося в &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; всего один раз) суффикс-палиндрома.&lt;br /&gt;
&lt;br /&gt;
Последнее свойство по сути эквивалентно лемме, так как все новые подстроки, которые появляются при дописывании очередного символа к строке, должны быть её суффиксами&amp;lt;ref&amp;gt;{{Sfn-текст|Droubay et al.|2001|pp=542—546}}&amp;lt;/ref&amp;gt;.}}&lt;br /&gt;
Помимо обычных дуг, которые служат переходами для префиксного дерева, для каждой вершины дерева палиндромов определяется &amp;#039;&amp;#039;суффиксная ссылка&amp;#039;&amp;#039;, которая ведёт из вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; в вершину &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;, соответствующую наибольшему собственному (не равному всей строке &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;) суффикс-палиндрому &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;. При этом суффиксная ссылка из «мнимой» вершины не определена, а из пустой вершины по определению ведёт в «мнимую». Суффиксные ссылки образуют дерево с корнем в «мнимой» вершине и играют важную роль в построении дерева палиндромов&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Построение ==&lt;br /&gt;
Как и многие другие строковые структуры, дерево палиндромов строится [[Итерация (математика)|итеративно]]. Изначально оно состоит лишь из вершин, соответствующих пустой и мнимой строкам. Затем структура постепенно перестраивается при наращивании строки по одному символу. Так как при добавлении одного символа в строке появляется не более одного нового палиндрома, перестройка дерева в худшем случае потребует добавления одной новой вершины и суффиксной ссылки к ней. Для определения возможной новой вершины в ходе построения дерева поддерживается указатель {{Math|last}} на вершину, соответствующую наибольшему из текущих суффикс-палиндромов&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Все суффикс-палиндромы строки достижимы по суффиксным ссылкам из {{Math|last}}, поэтому для определения нового суффикс-палиндрома (именно он будет соответствовать новой вершине, если таковая появится) необходимо переходить по суффиксным ссылкам {{Math|last}}, пока не обнаружится, что символ, предшествующий текущему суффикс-палиндрому, совпадает с символом, который был приписан к строке. Более формально, пусть &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; — максимальный суффикс-палиндром строки &amp;lt;math&amp;gt;S_{1,k} = s_1 s_2 \dots s_k&amp;lt;/math&amp;gt;, тогда либо &amp;lt;math&amp;gt;P=s_k&amp;lt;/math&amp;gt;, либо &amp;lt;math&amp;gt;P=s_k Q s_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; — некоторый суффикс-палиндром &amp;lt;math&amp;gt;S_{1,k-1}&amp;lt;/math&amp;gt;. Таким образом, перебирая &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; среди суффиксных ссылок {{Math|last}}, можно определить, может ли он быть расширен до &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; путём сравнения символов &amp;lt;math&amp;gt;s_{k-|Q|-1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;. Когда соответствующий суффикс-палиндром &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; был найден, следует проверить, присутствует ли в дереве палиндромов переход из соответствующей ему вершины по символу &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если такой переход есть, то &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; уже встречался в строке ранее и соответствует вершине, в которую ведёт этот переход. В противном случае необходимо создать для него новую вершину и провести переход по &amp;lt;math&amp;gt;s_k&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;. Затем следует определить суффиксную ссылку для &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;, которая соответствует второму максимальному суффикс-палиндрому &amp;lt;math&amp;gt;S_{1,k}&amp;lt;/math&amp;gt;. Для того, чтобы её найти, следует продолжать обход суффиксных ссылок {{math|last}}, пока не встретится вторая вершина &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;, такая что &amp;lt;math&amp;gt;s_{k-|Q|-1}=s_k&amp;lt;/math&amp;gt;; именно эта вершина и будет суффиксный ссылкой &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;. Если обозначить переход из вершины &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; по символу &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;\delta(v, c)&amp;lt;/math&amp;gt;, весь процесс может быть описан следующим [[Псевдокод (язык описания алгоритмов)|псевдокодом]]&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 {{math|&amp;#039;&amp;#039;&amp;#039;функция&amp;#039;&amp;#039;&amp;#039; find_link(v):}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;пока&amp;#039;&amp;#039;&amp;#039; s&amp;lt;sub&amp;gt;k-len(v)-1&amp;lt;/sub&amp;gt; ≠ s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;:}}&lt;br /&gt;
         {{math|&amp;#039;&amp;#039;&amp;#039;присвоить&amp;#039;&amp;#039;&amp;#039; v {{=}} link(v)}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;вернуть&amp;#039;&amp;#039;&amp;#039; v}}&lt;br /&gt;
 &lt;br /&gt;
 {{math|&amp;#039;&amp;#039;&amp;#039;функция&amp;#039;&amp;#039;&amp;#039; add_letter(c):}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;присвоить&amp;#039;&amp;#039;&amp;#039; k {{=}} k + 1}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;определить&amp;#039;&amp;#039;&amp;#039; s&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt; {{=}} c}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;определить&amp;#039;&amp;#039;&amp;#039; q {{=}} find_link(last)}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;если&amp;#039;&amp;#039;&amp;#039; δ(q, c) не определено:}}&lt;br /&gt;
         {{math|&amp;#039;&amp;#039;&amp;#039;определить&amp;#039;&amp;#039;&amp;#039; p {{=}} new_vertex()}}&lt;br /&gt;
         {{math|&amp;#039;&amp;#039;&amp;#039;определить&amp;#039;&amp;#039;&amp;#039; len(p) {{=}} len(q) + 2}}&lt;br /&gt;
         {{math|&amp;#039;&amp;#039;&amp;#039;определить&amp;#039;&amp;#039;&amp;#039; link(p) {{=}} δ(find_link(link(q)), c)}}&lt;br /&gt;
         {{math|&amp;#039;&amp;#039;&amp;#039;определить&amp;#039;&amp;#039;&amp;#039; δ(q, c) {{=}} p}}&lt;br /&gt;
     {{math|&amp;#039;&amp;#039;&amp;#039;присвоить&amp;#039;&amp;#039;&amp;#039; last {{=}} δ(q, c)}}&lt;br /&gt;
&lt;br /&gt;
Здесь предполагается, что изначально дерево описывается лишь двумя вершинами с длинами &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;-1&amp;lt;/math&amp;gt; соответственно с суффиксной ссылкой из первой вершины во вторую. В переменной {{Math|last}} хранится вершина, соответствующая наибольшему суффикс-палиндрому текущей строки, изначально она указывает на вершину нулевой строки. Также предполагается, что &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; изначально равно &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; и в &amp;lt;math&amp;gt;s_0&amp;lt;/math&amp;gt; записан некоторый служебный символ, который не встречается в строке &amp;lt;math&amp;gt;s_1 s_2 \dots s_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительная сложность ===&lt;br /&gt;
[[Вычислительная сложность|Сложность]] алгоритма может варьировать в зависимости от структур данных, в которых хранится таблица переходов в дереве. В общем случае при использовании [[Ассоциативный массив|ассоциативного массива]] время, затрачиваемое на обращение к &amp;lt;math&amp;gt;\delta(q, c)&amp;lt;/math&amp;gt;, достигает &amp;lt;math&amp;gt;O(\log \sigma)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; — размер алфавита, из символов которого построена строка. Стоит заметить, что каждая итерация первого вызова {{Math|find_link}} уменьшает длину {{Math|last}}, а второго — длину {{Math|link(last)}}, которые между последовательными вызовам {{Math|add_letter}} могут увеличиться только на единицу. Таким образом, суммарное время работы {{Math|find_link}} не превосходит &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, а общее время, требуемое для выполнения &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; вызовов {{Math|add_letter}}, можно оценить как &amp;lt;math&amp;gt;O(n \log \sigma)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;. Расход памяти у данной структуры в худшем случае линейный, однако если рассматривать усреднённый размер структуры по всем строкам заданной длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, средний расход памяти будет порядка &amp;lt;math&amp;gt;O(\sqrt{n \sigma})&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;{{sfn-текст|Rubinchik, Shur|2016|p=1}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
Одновременно с введением данной структуры данных Рубинчик и Шур также предложили ряд модификаций, позволяющих расширить область задач, решаемых деревом палиндромов. В частности, был предложен метод, позволяющий с той же асимптотикой построить общее дерево палиндромов для множества строк &amp;lt;math&amp;gt;S_1, S_2, \dots, S_k&amp;lt;/math&amp;gt;. Такая модификация позволяет решать те же задачи, рассматриваемые в контексте множества строк — например, найти наибольший общий подпалиндром всех строк или число различных подпалиндромов всех строк в совокупности. Другой предложенной модификацией стал вариант построения дерева, при котором на добавление одного символа требуется &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; времени &amp;#039;&amp;#039;в худшем случае&amp;#039;&amp;#039; (а не &amp;lt;math&amp;gt;O(\log \sigma)&amp;lt;/math&amp;gt; &amp;#039;&amp;#039;[[Амортизационный анализ|амортизированно]]&amp;#039;&amp;#039;, как это происходит в стандартном построении) и &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; памяти. Такой подход позволяет обеспечить {{Iw|Персистентная структура данных|частичную персистентность||Persistent data structure}} дерева, при которой можно в произвольные моменты времени откатывать добавление последнего символа. Кроме того, была предложена полностью персистентная версия дерева, позволяющая обратиться и дописать символ к любой из сохранённых ранее версий за &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; времени и памяти в худшем случае&amp;lt;ref&amp;gt;{{Sfn-текст|Rubinchik, Shur|2018|p=6—11}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В 2019 году Ватанабе с коллегами разработали на основе дерева палиндромов структуру данных, называемую {{Math|e&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;rtre&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;}}, для работы с подпалиндромами строк, заданных [[Кодирование длин серий|кодированием длин серий]]&amp;lt;ref name=&amp;quot;:1&amp;quot; /&amp;gt;, а в 2020 году тот же состав авторов, совместно с Миено, разработали два алгоритма, позволяющих поддерживать дерево палиндромов на скользящем окне размера &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt;. Первый из указанных алгоритмов требует &amp;lt;math&amp;gt;O(n \log \sigma)&amp;lt;/math&amp;gt; времени и &amp;lt;math&amp;gt;O(d)&amp;lt;/math&amp;gt; памяти, а второй — &amp;lt;math&amp;gt;O(n+d\sigma)&amp;lt;/math&amp;gt; времени и &amp;lt;math&amp;gt;O(d\sigma)&amp;lt;/math&amp;gt; памяти&amp;lt;ref&amp;gt;{{Sfn-текст|Mieno et al.|2020}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Применения ==&lt;br /&gt;
Дерево палиндромов даёт множество возможных применений для получения теоретически быстрых и практически легко реализуемых алгоритмов для решения ряда комбинаторных задач в программировании и математической кибернетике&amp;lt;ref&amp;gt;{{Sfn-текст|Рубинчик|2016|страницы=75—76}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Одной из задач, для которых была разработана данная структура, является подсчёт различных подпалиндромов в строке {{Iw|Онлайн-алгоритм|в режиме онлайн||Online algorithm}}. Она может быть поставлена следующим образом: к изначально пустой строке поочерёдно приписывается по одному символу. На каждом шаге необходимо вывести число различных подпалиндромов в данной строке. С точки зрения дерева палиндромов это эквивалентно тому, чтобы на каждом шаге вывести количество нетривиальных вершин в структуре. Линейное решение для оффлайн-версии данной задачи было представлено в 2010 году&amp;lt;ref&amp;gt;{{sfn-текст|Groult|2010}}&amp;lt;/ref&amp;gt;, а оптимальное решение со временем исполнения &amp;lt;math&amp;gt;O(n \log \sigma)&amp;lt;/math&amp;gt; для онлайн-версии было найдено в 2013 году&amp;lt;ref&amp;gt;{{sfn-текст|Kosolobov et al.|2013}}&amp;lt;/ref&amp;gt;. Указанное решение, однако, использовало две «тяжеловесные» структуры данных — аналог [[алгоритм Манакера|алгоритма Манакера]], а также [[суффиксное дерево]]. Дерево палиндромов же, с одной стороны, имеет ту же асимптотику в худшем случае, а с другой — является значительно более легковесной структурой&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Другим возможным применением данной структуры является перечисление палиндромно-богатых двоичных строк&amp;lt;ref&amp;gt;{{OEIS|A216264}}&amp;lt;/ref&amp;gt;. Ранее было показано, что слово длины &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; может содержать не более &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; различных палиндромов, палиндромно-богатыми называются слова, на которых данная оценка достигается. Понятие палиндромно-богатых слов было введено Эми Глен и коллегами в 2008 году&amp;lt;ref&amp;gt;{{Sfn-текст|Glen et al.|2009}}&amp;lt;/ref&amp;gt;. Рубинчик и Шур показали, что с помощью дерева палиндромов можно обнаружить все палиндромно-богатые слова, чья длина не превосходит &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; за &amp;lt;math&amp;gt;O(R)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; — количество таких слов. Данный результат позволил увеличить количество известных членов последовательности {{OEIS short|A216264}} в [[OEIS]] c 25 до 60. Полученные данные показали, что последовательность растёт значительно медленнее, чем это предполагалось ранее, а именно она ограничена сверху как &amp;lt;math&amp;gt;O(1,605^n)&amp;lt;/math&amp;gt;&amp;lt;ref&amp;gt;{{Sfn-текст|Rukavicka|2017}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{Примечания|30em}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
{{refbegin}}&lt;br /&gt;
* {{ВД-Источник|Q90824086|ref=Рубинчик|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q90835213|ref=Droubay et al.|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q96738845|ref=Groult|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q96738920|ref=Kosolobov et al.|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q96655649|ref=Mieno|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q96718109|ref=Rubinchik, Shur|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q90726647|ref=Rubinchik, Shur|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q90737123|ref=Watanabe et al.|pages=|volume=|issue=}}&lt;br /&gt;
* {{ВД-Источник|Q97016349|pages=|volume=|issue=|ref=Glen et al.}}&lt;br /&gt;
* {{ВД-Источник|Q97016369|pages=|volume=|issue=|ref=Rukavicka}}{{refend}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* {{Cite web|url=https://neerc.ifmo.ru/wiki/index.php?title=Дерево_палиндромов|title=Дерево палиндромов|website=Вики-конспекты ИТМО}}&lt;br /&gt;
{{Строки}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Структуры данных]]&lt;br /&gt;
[[Категория:Строковые алгоритмы]]&lt;br /&gt;
{{Хорошая статья|Математика}}&lt;/div&gt;</summary>
		<author><name>ru_wikipedia&gt;Adamant.pwn</name></author>
	</entry>
</feed>