E. Различные подстроки
Посчитайте количество различных непустых подстрок данной строки.
Хеши по длинам
Подстроки разной длины различны заведомо. Значит ответ - сумма по длинам количества различных хешей среди кусков длины :
Long answer = 0;
for (int len = 1; len <= n; len++) {
std::unordered_set<Long> seen;
for (int i = 0; i + len <= n; i++) seen.insert(sub(i, i + len - 1));
answer += seen.size();
}
Это вставок в множество. При - два миллиона, проходит.
Чем это отличается от таблицы lcp
В прошлом занятии та же задача решалась таблицей наибольших общих префиксов - тоже , но по памяти , а здесь . Разница видна как раз на границе: таблица при занимает 16 мегабайт, хеши - ничего.
Настоящее решение этой задачи - суффиксный массив с массивом lcp за или суффиксный автомат за . Ограничение здесь занижено намеренно: занятие про хеши.
Про unordered_set
unordered_set от long long при плохом раскладе деградирует до квадрата из-за предсказуемой хеш-функции. Надёжнее собрать все хеши в вектор, отсортировать и посчитать различные - это на длину без риска.
Подробнее: «Полиномиальное хеширование».
Формат ввода
Одна строка из строчных латинских букв длиной не больше 2000.
Формат вывода
Выведите количество различных непустых подстрок.
Примеры
aaa
3
abab
7