Изменения
Нет описания правки
/*p - образец
n - длина образца
left - левая граница диапазона // изначально равна единице
right - правая граница диапазона // изначально равна длине строки
lh - вспомогательная переменная для определения левой границы диапазона
rg - вспомогательная переменная для определения правой границы диапазона
find - функция уточнения диапазона
элементы строк и массивов нумеруются с единицы*/
for i = 1 to n{ lh = n + 1 rh = 0
find(left, right, i)
left = lh right = rh } if (left != -1 0 && right != -n + 1) { // если диапазон не пуст
yield left // вывод левой границы диапазона
yield right // вывод правой границы диапазона
} else
yield "No matches" // вывод информации об отсутствии вхождений
r - правая граница диапазона при поиске
k - номер символа образца, с которым происходит проверка на данном шаге
s - строка
length - длина строки
array - суффиксный массив
x - индекс, стоящий по середине между l и r*/
if (l > r)
return
x = (l + r) / 2
if (array[x] + k - 1 <= length){
if (s[array[x] + k - 1] == p[k]){
if (x < lh)
lh = x
if (x > rh)
rh = x
find(l, x - 1, k)
find(x + 1, r, k)
} else {
if (s[array[x] + k - 1] > p[k]) {
find(l, x - 1, k)
} else {
if (s[array[x] + k - 1] < p[k]) {
find(x + 1, r, k)
}
} else {
find(l, x - 1, k)
find(x + 1, r, k)
}