EduBrick
← вернуться к уроку · Уровень профи: проверь себя

G. Общая подстрока двух строк

1400 мс · 256 МБ · всё или ничего

Найдите длину наибольшей общей подстроки двух строк.

Тот же двоичный поиск

Свойство «есть общая подстрока длины LL» монотонно, поэтому длина ищется двоичным поиском. Проверка: собрать хеши всех кусков длины LL первой строки в множество и пройти по кускам второй.

Сложность O((n+m)logn)O((n + m) \log n) при сортировке или хеш-таблице. Это принципиально лучше квадратичной динамики из прошлого занятия, где ограничение было 2500, а здесь - 10510^5.

Почему динамика тут не проходит

Динамика «наибольший общий суффикс префиксов» требует таблицы n×mn \times m: при 10510^5 это 101010^{10} ячеек. Даже свёрнутая до двух строк, она требует 101010^{10} операций по времени. Хеши убирают именно перебор пар позиций.

Ловушка сравнения

Если сравнивать хеши по одному модулю 10910^9, при 21052 \cdot 10^5 кусков ожидаемое число ложных совпадений около 20 - и ответ будет завышен. Два модуля обязательны. Проверить это легко: посчитайте ответ обеими схемами на строке из одной буквы.

Подробнее: «Сравнение подстрок».

Формат ввода

В первой строке - строка aa, во второй - строка bb. Обе непусты, состоят из строчных латинских букв, длины не превосходят 10510^5.

Формат вывода

Выведите длину наибольшей общей подстроки. Если общих подстрок нет, выведите 0.

Примеры

ввод
abcde
cdefg
вывод
3
ввод
abc
xyz
вывод
0
Войдите, чтобы отправлять решения.
← Вернуться к уроку