$ Строки: хеши и бор
vb = [Ваня]
sk = [Сережа.K]
sm = [Сережа.М]
# $sm$ Декартово дерево
## Остатки
# $vb$ Строки, строки, строки
## Хеши
### Сравнение на равенство за O(1)
### Сравнение на больше-меньше за O(logn)
### Выбор модуля. Реализация: как и в частичных суммах h[0] = 0
### Решение задач
## Хеш-таблица
### Открытая адресация (быстро, но только добавление)
### Списки
## Задачи
### LCP(i, j) за O(logn) хешами
### Наибольшая общая подстрока за O(nlogn)
### LCP(i, j) для всех i, j динамикой за O(n^2)
## Бор
### Реализация через next[N][26]
### Реализация через списки, хеш-таблицу
### Сжатый бор: ребро = подстрока исходной строки
### Суф.дерево, построение за O(n^2) и O(n) памяти, число различных подстрок
v = vector<int>(n)
vn = vector<int>(n)
# $sk$ С/C++
## $vn$ = {int *a, size\_t n, size\_t size}
## Один $vn$. Он быстрый как new int[n]
. Мятный как орбит-мята.
## Создадим 10^7 векторов, в каждый сделаем 4 раза push\_back. Долго?
### reserve(4), resize(4)
### operator new, operator delete
### замеряем время освобождения памяти: оборачиваем массив векторов в объект