Изменения

Перейти к: навигация, поиск
Псевдокод
===Псевдокод===
Массивы и строки нумеруются с нуля.
Сравнения <<tex>_z </tex> , ><tex>_z </tex> , =<tex>_z </tex> , <=<tex>_z </tex> , >=<tex>_z </tex> означают лексикографическое сравнение двух строк по их первым z символам.
Сравнения < , > , == , <= , >= при применении к строкам означают полное лексикографическое сравнение строк.
Функция '''lcp'''<tex>_z</tex>(s, p) ищет количество совпадений символов строк s и p начиная с позиции z.
n - длина строки s.
w - длина строки p.
В алгоритме используются переменные, введенные выше в разделе "более быстрый поиск".
Поиск левой границы ответов <tex> L_p </tex>.
/*
Массивы и строки нумеруются с нуля.
Сравнения <<tex>_z </tex> , ><tex>_z </tex> , =<tex>_z </tex> , <=<tex>_z </tex> , >=<tex>_z </tex> означают
лексикографическое сравнение двух строк по их первым z символам.
Сравнения < , > , == , <= , >= при применении к строкам
означают полное лексикографическое сравнение строк.
Функция '''lcp'''<tex>_z</tex>(s, p) ищет количество совпадений символов
строк s и p начиная с позиции z.
n - длина строки s.
w - длина строки p.
В алгоритме используются переменные, введенные выше в разделе "более быстрый поиск".
*/
l = '''lcp'''(p, s[array[0]]);
r = '''lcp'''(p, s[array[n - 1]]);
'''if''' (l == w or p < s[array[0]])
L<tex>_p</tex> L_p = 0;
'''else''' '''if''' (p > s[array[n - 1])
L<tex>_p</tex> L_p = n;
'''else''' {
L = 0;
'''while''' (R - L > 1) '''do''' {
M = (L + R) / 2;
m<tex>_l</tex> m_l = '''lcp'''(array[L], array[M]); m<tex>_r</tex> m_r = '''lcp'''(array[M], array[R]);
'''if''' (l >= r)
'''if''' (m<tex>_l</tex> m_l >= l) m = l + '''lcp'''<tex>_l</tex>(s[array[M]], p);
'''else'''
m = m<tex>_l</tex>m_l;
'''else'''
'''if''' (m<tex>_r</tex> m_r >= r) m = r + '''lcp'''<tex>_r</tex>(s[array[M]], p);
'''else'''
m = m<tex>_r</tex>m_r;
'''if''' (m == w || p <=<tex>_m</tex> s[array[M]]){
R = M;
}
}
L<tex>_p</tex> L_p = R;
}
Анонимный участник

Навигация