Изменения
→Более быстрый поиск
На <tex> i </tex>-ом шаге алгоритма мы определяем диапазон, в котором <tex> i </tex> первых символов образца и суффиксов диапазона совпадают. На самом деле нам не обязательно на каждом шаге проверять лишь один новый символ. Воспользуемся <tex> lcp </tex>(longest common prefix). <br>
Пусть левая и правая границы нашего диапазона на каком-то шаге - это <tex> L </tex> и <tex> R </tex> соответственно. Допустим, что мы знаем длину общего префикса образца с суффиксами, лежащими на краях текущего диапазона: <tex> l </tex> - общий префикс образца и суффикса с левого края (<tex> l = lcp(p, array[L]) </tex>), а <tex> r </tex> - общий префикс образца и суффикса с правого края, (<tex> r = lcp(p, array[R]) </tex>). Будем поддерживать <tex> l </tex> и <tex> r </tex> после каждого уточнения границ диапазона. <br>
Для каждой пары суффиксов внутри текущего диапазона их lcp не меньше, чем минимум из <tex> l </tex> и <tex> r </tex>, то есть
общий префикс образца и любого суффикса внутри диапазона не меньше <tex> m = min(l,r) </tex>. Значит <tex> m </tex> символов можно пропускать сразу, зная, что они совпадают в любом случае, и сравнивать только начиная с уже <tex> m + 1 </tex> символасимвол.
[[Файл:pic.png|450px]]
==Литература==
* http://habrahabr.ru/blogs/algorithm/115346/