Бордер строки - это её собственный префикс, который одновременно является суффиксом. Выведите длины всех бордеров данной строки.
Цепочка ссылок
Наибольший бордер - это в точности . А следующий по величине - наибольший бордер этого бордера, то есть . Продолжая, получаем все бордеры по убыванию:
for (int k = p[n - 1]; k > 0; k = p[k - 1]) answer.push_back(k);
Почему в цепочке оказываются все бордеры: если - бордер, а - следующий за ним по величине, то - бордер строки длины ; иначе между ними нашёлся бы бордер побольше.
Сколько их бывает
У строки aaaa...a из букв бордеров ровно - то есть цепочка бывает длинной, и хранить её надо в массиве, а не считать «сколько-нибудь коротким».
Зато длины бордеров образуют не больше арифметических прогрессий - на этом факте строятся быстрые алгоритмы, где по всем бордерам нельзя пройтись явно.
Связь с периодом
Бордер длины равносилен периоду длины . Наибольшему бордеру соответствует наименьший период - это следующая задача занятия.
Подробнее: «Бордеры и префикс-функция», «Период строки».
Формат ввода
Одна строка из строчных латинских букв длиной не больше .
Формат вывода
В первой строке выведите количество бордеров .
Во второй строке - их длины в порядке убывания. Если бордеров нет, вторую строку оставьте пустой.
Примеры
abacaba
2 3 1
abcdef
0