$ Строки: хеши и бор 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 ### замеряем время освобождения памяти: оборачиваем массив векторов в объект