Суффиксные структуры

Суффиксный массив: сортировка всех суффиксов строки и что она даёт.

Суффиксный массив — отсортированный список всех суффиксов строки (хранятся, конечно, только их начальные позиции). Он открывает целый класс задач: поиск любого образца за O(m log n), число различных подстрок, наибольшая общая подстрока двух строк. Строить сортировкой «в лоб» — O(n² log n): сравнение суффиксов длинное. Классический трюк — сортировка по степеням двойки: сортируем суффиксы сначала по первым 1, потом 2, 4, 8... символам. На каждом шаге суффикс описывается ПАРОЙ классов эквивалентности с прошлого шага — сравнение пары за O(1).

Суффиксный массив за O(n log² n). Введите: banana

Для banana порядок суффиксов: a, ana, anana, banana, na, nana. Разбор трюков: • терминальный символ $ (меньше любых букв) выравнивает суффиксы до «циклических сдвигов» — поэтому работает (i + len) % n; • класс эквивалентности — «номер группы одинаковых префиксов длины len»; пара (класс начала, класс середины) полностью описывает префикс длины 2·len; • со счётной сортировкой вместо std::sort получается классический O(n log n). Следующий шаг темы — массив LCP (длины общих префиксов соседних суффиксов, алгоритм Касаи за O(n)): с ним считается, например, число различных подстрок. Ещё мощнее — суффиксный автомат, но он ждёт вас после уверенного владения массивом.
Задание: с помощью суффиксного массива banana посчитайте руками число различных подстрок (сумма длин суффиксов минус сумма LCP; ответ: 15). Отметьте урок пройденным.
Доска