3622
правки
Изменения
→Алгоритм Дюваля: переписан алгоритм
}}
Во время работы алгоритма строка <tex>s</tex> представлена представляется в виде конкатенации трёх строк <tex>s = s_1s_2s_3</tex>, где для строки <tex>s_1</tex> декомпозиция Линдона уже найдена, и <tex>s_1</tex> уже больше не используется алгоритмом; строка <tex>s_2</tex> {{---}} это предпростая строка; строка <tex>s_3</tex> {{---}} ещё не обработанная алгоритмом часть строки <tex>s</tex>. Алгоритм Дюваля берёт первый символ строки <tex>s_3</tex> и пытается дописать его к строке <tex>s_2</tex>. При этом, возможно, для какого-то префикса строки <tex>s_2</tex> декомпозиция Линдона становится известной, и эта часть переходит к строке <tex>s_1</tex>.
Будем поддерживаться указатель поддерживать три указателя:* <tex>i</tex> {{---}} на начало строки <tex>s_2</tex>. * <tex>j</tex> {{---}} на текущий символ в строке <tex>s_2</tex>, с которым будет производиться сравнение* <tex>k</tex> {{---}} на начало строки <tex>s_3</tex> Внешний цикл алгоритма будет выполняться, пока <tex>i < n</tex>, то есть пока вся строка <tex>s</tex> не перейдёт в строку <tex>s_1</tex>. Внутри этого цикла создаются два указателя: указатель <tex>j</tex> на начало строки <tex>s_3</tex> и указатель <tex>k</tex> на текущий символ в строке <tex>s_2</tex>, с которым будет производиться сравнение. Затем будем в цикле пытаться добавить символ <tex>s[jk]</tex> к строке <tex>s_2</tex>, для чего необходимо произвести сравнение с символом <tex>s[kj]</tex>. При этом будем поддерживать инвариант: <tex>k - j - k</tex> {{---}} длина подстроки <tex> w</tex>.
Возникают три различных случая:
===Реализация===
n <tex>\leftarrow</tex> |s|
i <tex>\leftarrow</tex> 0
cur <tex>\leftarrow</tex> 0
'''while''' i <tex> < </tex> n:
j <tex>\leftarrow</tex> i + 1 k <tex>\leftarrow</tex> i+ 1 '''while''' j k <tex> < </tex> n '''and''' s[kj] <tex> \leqslant </tex> s[jk]: '''if''' s[kj] <tex> < </tex> s[jk]: k j <tex>\leftarrow</tex> i
'''else:'''
===Корректность===