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

D. Все бордеры

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

Бордер строки - это её собственный префикс, который одновременно является суффиксом. Выведите длины всех бордеров данной строки.

Цепочка ссылок

Наибольший бордер - это в точности π[n1]\pi[n-1]. А следующий по величине - наибольший бордер этого бордера, то есть π[π[n1]1]\pi[\pi[n-1]-1]. Продолжая, получаем все бордеры по убыванию:

for (int k = p[n - 1]; k > 0; k = p[k - 1]) answer.push_back(k);

Почему в цепочке оказываются все бордеры: если bb - бордер, а cc - следующий за ним по величине, то cc - бордер строки длины bb; иначе между ними нашёлся бы бордер побольше.

Сколько их бывает

У строки aaaa...a из nn букв бордеров ровно n1n-1 - то есть цепочка бывает длинной, и хранить её надо в массиве, а не считать «сколько-нибудь коротким».

Зато длины бордеров образуют не больше O(logn)O(\log n) арифметических прогрессий - на этом факте строятся быстрые алгоритмы, где по всем бордерам нельзя пройтись явно.

Связь с периодом

Бордер длины bb равносилен периоду длины nbn - b. Наибольшему бордеру соответствует наименьший период - это следующая задача занятия.

Подробнее: «Бордеры и префикс-функция», «Период строки».

Формат ввода

Одна строка из строчных латинских букв длиной не больше 10610^6.

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

В первой строке выведите количество бордеров kk.

Во второй строке - их длины в порядке убывания. Если бордеров нет, вторую строку оставьте пустой.

Примеры

ввод
abacaba
вывод
2
3 1
ввод
abcdef
вывод
0

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