<?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=92.100.177.90&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=92.100.177.90&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/92.100.177.90"/>
		<updated>2026-04-27T13:21:15Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Z-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=22835</id>
		<title>Z-функция</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Z-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=22835"/>
				<updated>2012-05-28T18:23:12Z</updated>
		
		<summary type="html">&lt;p&gt;92.100.177.90: /* Время работы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определение==&lt;br /&gt;
Z-функция от строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и позиции &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; — это длина максимального префикса подстроки, начинающейся с позиции &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, который одновременно является и префиксом всей строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. Значение &amp;lt;tex&amp;gt;Z[0]&amp;lt;/tex&amp;gt; не определено, поэтому его обычно приравнивают к нулю или к длине строки.&lt;br /&gt;
[[Файл:Zfunc-examp.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм поиска==&lt;br /&gt;
Для работы алгоритма заведём две переменные: &amp;lt;tex&amp;gt;left&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; — начало и конец наибольшего префикса строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; с максимальным значением &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt;. Изначально &amp;lt;tex&amp;gt;left=0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;right=0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть нам известны значения Z-функции от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;. Найдём &amp;lt;tex&amp;gt;Z[i]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Рассмотрим два случая.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1) &amp;lt;tex&amp;gt;i &amp;gt; right&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
Просто пробегаемся по строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и сравниваем символы на позициях &amp;lt;tex&amp;gt;S[i+j]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S[j]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; первая позиция в строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; для которой не выполняется равенство &amp;lt;tex&amp;gt;S[i+j] == S[j]&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; это и Z-функция для позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;left = i, right = i + j - 1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2) &amp;lt;tex&amp;gt;i \le right&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
Сравним &amp;lt;tex&amp;gt;Z[i - left] + i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; меньше, то надо просто пробежаться по строке начиная с позиции &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; и вычислить значение &amp;lt;tex&amp;gt;Z[i]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Иначе мы уже знаем значение &amp;lt;tex&amp;gt;Z[i]&amp;lt;/tex&amp;gt;, так как оно равно значению &amp;lt;tex&amp;gt;Z[i - left]&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:z-func.png]]&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
Этот алгоритм работает за &amp;lt;tex&amp;gt;O(\lvert S\rvert)&amp;lt;/tex&amp;gt;, так как каждая позиция пробегается не более двух раз: при попадании в диапазон от &amp;lt;tex&amp;gt;left&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; и при высчитывании &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt;-функции простым циклом.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''Zfunction'''(p) &lt;br /&gt;
    answer[0] = 0&lt;br /&gt;
    left = 0&lt;br /&gt;
    right = 0&lt;br /&gt;
    '''for''' (i = 1..(n - 1))&lt;br /&gt;
       '''if''' (i &amp;gt; right)&lt;br /&gt;
          j = 0&lt;br /&gt;
          '''while''' (i + j &amp;lt; n &amp;amp;&amp;amp; p[i + j] == p[j])&lt;br /&gt;
             j++&lt;br /&gt;
          answer[i] = j&lt;br /&gt;
          left = i&lt;br /&gt;
          right = i + j - 1&lt;br /&gt;
       '''else if''' (answer[i - left] &amp;lt; right - i + 1)&lt;br /&gt;
          answer[i] = answer[i - left]&lt;br /&gt;
       '''else''' &lt;br /&gt;
          j = 1&lt;br /&gt;
          '''while''' (j + right &amp;lt; n &amp;amp;&amp;amp; p[j + right - i] == p[right + j])&lt;br /&gt;
             j++&lt;br /&gt;
          answer[i] = right + j - i&lt;br /&gt;
          left = i&lt;br /&gt;
          right = right + j - 1&lt;br /&gt;
    '''return''' answer&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
[http://habrahabr.ru/post/113266/ Поиск подстроки и смежные вопросы — Хабр]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ru.wikipedia.org/wiki/Z-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F Z-функция — Википедия]&lt;/div&gt;</summary>
		<author><name>92.100.177.90</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Z-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=22833</id>
		<title>Z-функция</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Z-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=22833"/>
				<updated>2012-05-28T18:16:02Z</updated>
		
		<summary type="html">&lt;p&gt;92.100.177.90: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определение==&lt;br /&gt;
Z-функция от строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и позиции &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; — это длина максимального префикса подстроки, начинающейся с позиции &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, который одновременно является и префиксом всей строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;. Значение &amp;lt;tex&amp;gt;Z[0]&amp;lt;/tex&amp;gt; не определено, поэтому его обычно приравнивают к нулю или к длине строки.&lt;br /&gt;
[[Файл:Zfunc-examp.png|600px]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм поиска==&lt;br /&gt;
Для работы алгоритма заведём две переменные: &amp;lt;tex&amp;gt;left&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; — начало и конец наибольшего префикса строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; с максимальным значением &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt;. Изначально &amp;lt;tex&amp;gt;left=0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;right=0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть нам известны значения Z-функции от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt;. Найдём &amp;lt;tex&amp;gt;Z[i]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Рассмотрим два случая.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
1) &amp;lt;tex&amp;gt;i &amp;gt; right&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
Просто пробегаемся по строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и сравниваем символы на позициях &amp;lt;tex&amp;gt;S[i+j]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S[j]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; первая позиция в строке &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; для которой не выполняется равенство &amp;lt;tex&amp;gt;S[i+j] == S[j]&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; это и Z-функция для позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;left = i, right = i + j - 1&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
2) &amp;lt;tex&amp;gt;i \le right&amp;lt;/tex&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
Сравним &amp;lt;tex&amp;gt;Z[i - left] + i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; меньше, то надо просто пробежаться по строке начиная с позиции &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; и вычислить значение &amp;lt;tex&amp;gt;Z[i]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Иначе мы уже знаем значение &amp;lt;tex&amp;gt;Z[i]&amp;lt;/tex&amp;gt;, так как оно равно значению &amp;lt;tex&amp;gt;Z[i - left]&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:z-func.png]]&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
Этот алгоритм работает за &amp;lt;tex&amp;gt;O(\lvert S\rvert)&amp;lt;/tex&amp;gt;, так как каждая позиция пробегается не более двух раз: при попадании в диапазон от &amp;lt;tex&amp;gt;left&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;right&amp;lt;/tex&amp;gt; и при высчитывании Z-функции простым циклом.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
 '''Zfunction'''(p) &lt;br /&gt;
    answer[0] = 0&lt;br /&gt;
    left = 0&lt;br /&gt;
    right = 0&lt;br /&gt;
    '''for''' (i = 1..(n - 1))&lt;br /&gt;
       '''if''' (i &amp;gt; right)&lt;br /&gt;
          j = 0&lt;br /&gt;
          '''while''' (i + j &amp;lt; n &amp;amp;&amp;amp; p[i + j] == p[j])&lt;br /&gt;
             j++&lt;br /&gt;
          answer[i] = j&lt;br /&gt;
          left = i&lt;br /&gt;
          right = i + j - 1&lt;br /&gt;
       '''else if''' (answer[i - left] &amp;lt; right - i + 1)&lt;br /&gt;
          answer[i] = answer[i - left]&lt;br /&gt;
       '''else''' &lt;br /&gt;
          j = 1&lt;br /&gt;
          '''while''' (j + right &amp;lt; n &amp;amp;&amp;amp; p[j + right - i] == p[right + j])&lt;br /&gt;
             j++&lt;br /&gt;
          answer[i] = right + j - i&lt;br /&gt;
          left = i&lt;br /&gt;
          right = right + j - 1&lt;br /&gt;
    '''return''' answer&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
[http://habrahabr.ru/post/113266/ Поиск подстроки и смежные вопросы — Хабр]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://ru.wikipedia.org/wiki/Z-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F Z-функция — Википедия]&lt;/div&gt;</summary>
		<author><name>92.100.177.90</name></author>	</entry>

	</feed>