Задача №114688. Вставить текст

Алиса и Аня работают копирайтерами. Недавно им пришёл заказ: нужно написать \(k\) текстов (строк) на схожую тематику. Девочки сразу приступили к работе и быстро получили \(k\) строк \(S_1, \dotsc, S_k\), каждая из которых имеет длину не более \(m\) и состоит из строчных латинских букв, при чем длина \(S_1\) оказалсь в точности равна \(m\).

Девочки уже давно работают вместе, и у них есть простой способ проверить оригинальность своей работы. Оригинальность оценивается с помощью подстрок полученных текстов. Алиса и Аня считают некоторую строку неоригинальной, если и она, и строка, получающаяся из данной разворотом, встречаются в некоторых из их текстов в качестве подстрок на одних и тех же позициях.

Чтобы ускорить проверку, они разбивают строки на блоки. Разбиение на \(t\) блоков задается последовательностью \(a_0, a_1, \dotsc, a_t\), где \(a_0 = 0\), \(a_t = m\) и \(a_{i-1} < a_{i}\) для любого \(1\le i\le t\). Тогда \(i\)-м блоком называется отрезок целых чисел \([a_{i-1}+1; a_i]\). Блок \([a_{i-1}+1; a_i]\) называется интересным, если существует неоригинальная строка, встречающаяся в текстах ровно на позициях, задаваемых данным блоком. Иными словами, блок — интересный, если для каких-то строк \(S_l\) и \(S_r\) (возможно, \(l = r\)) верно, что \(|S_l|,|S_r| \ge a_i\), и строка \(S_{l,\,a_{i-1}+1}S_{l,\,a_{i-1}+2}\dotsc S_{l,\,a_i}\) совпадает со строкой \(S_{r,\,a_i}S_{r,\,a_i-1}\dotsc S_{r,\,a_{i-1}+1}\), где \(S_{t,j}\) — \(j\)-й слева символ строки \(S_t\).

Например, для текстов [ abba , ba ] последовательности \((0,1,4)\) и \((0,1,2,3,4)\) задают корректные разбиения, а последовательности \((1,2,3)\) и \((0,1,1,4)\) — нет. При этом для разбиения \((0,2,4)\) первый блок \([1;2]\) является интересным, поскольку \(S_{1,1}S_{1,2}=S_{2,2}S_{2,1}=\) ab , а второй блок \([3;4]\) — нет, поскольку для единственной возможной пары номеров \(l = r = 1\) строки \(S_{1,3}S_{1,4}=\) ba и \(S_{1,4}S_{1,3}=\) ab не совпадают.

Разбиение называется интересным, если каждый блок в этом разбиении интересный. Алиса и Аня хотят найти интересное разбиение текстов на минимальное число блоков, чтобы измерить оригинальность работы. Девочки постарались, чтобы условие этой задачи было современным и прошло тест Бекдел, поэтому теперь помогите им и напишите для них программу, измеряющую оригинальность!

Заметим, что искомая величина корректно определена, так как, разбив строки на \(m\) блоков длины \(1\), мы получим интересное разбиение (в каждом блоке будет достаточно взять \(l = r = 1\)).

Входные данные

Во первой строке вводятся три целых числа \(t\), \(k\) и \(m\) (\(1 \le k \le 200\,000\), \(1 \le m \le 500\,000\)) — номер группы, к которой относится данный тест, общее число текстов и длина первого текста.

В \(i\)-й из следующих \(k\) строк вводится \(S_i\) — \(i\)-й текст, состоящий из строчных букв латинского алфавита.

Гарантируется, что \(|S_1|=m\), \(|S_i|\le m\) для любого \(i>1\), и суммарная длина всех строк не превосходит \(500\,000\).

Выходные данные

В первой строке выведите единственное целое число \(t\) — минимальное число блоков в интересном разбиении.

Во второй строке через пробел выведите возрастающую последовательность из \(t-1\) целого числа \(a_1,\dotsc,a_{t-1}\) — номеров правых границ всех блоков, кроме последнего (само разбиение имеет вид \([1;a_1]\), \([a_1+1;a_2]\),...,\([a_{t-1}+1;m]\)).

Примечание

В первом примере вторая строка cba при перевороте совпадает с первыми тремя символами первой строки abcded . Оставшиеся же символы ded образуют палиндром, т.е. эта строка совпадает с собой же перевёрнутой. Поэтому мы можем разбить строки на два блока \([1;3]\) и \([4;6]\). Легко видеть, что на меньшее число блоков разбить нельзя, ведь abcded — не палиндром.

Во втором примере в первом блоке \([1;3]\) можно выбрать строку-палиндром sus , во втором блоке кусочки пятой ( gho ul ) и шестой ( sod lu v ) строк, совпадающих друг с другом при перевороте. В третьем и четвертом блоках выбираем по одной букве из любой строки. Можно показать, что на меньшее число блоков разбить строки нельзя.

Система оценки

Тесты к этой задаче состоят из десяти групп. Баллы за каждую группу ставятся только при прохождении всех тестов группы и всех тестов всех необходимых групп. Offline-проверка означает, что результаты тестирования вашего решения на данной группе станут доступны только после окончания соревнования.

Обозначим суммарную длину всех строк как \(L\).

Доп. ограничения
Группа Баллы \(k\) \(m\) \(L\) Необх. группы Комментарий
0 0 Тесты из условия.
1 7 \(k \le 100\) \(m \le 10\) \(L \le 1000\) 0
2 8 \(k \le 20\) \(m \le 100\) \(L \le 2000\) 0
3 10 \(k \le 200\) \(m \le 200\) \(L \le 40\,000\) 0 – 2
4 12 \(k \le 200\) \(m \le 2000\) \(L \le 400\,000\) 0 – 3
5 9 Гарантируется, что в ответе не больше двух блоков.
6 11 \(k = 1\) \(m \le 50\,000\) \(L \le 50\,000\)
7 11 \(k = 1\) 6
8 10 \(k = 2\)
9 9 \(m \le 200\,000\) \(L \le 200\,000\) 0 – 3, 6
10 13 0 – 9 Offline-проверка.
Примеры
Входные данные
0 2 6
abcded
cba
Выходные данные
2
3 
Входные данные
0 6 7
poggers
sus
amogus
tokyo
ghoul
sodluv
Выходные данные
4
3 5 6 
Сдать: для сдачи задач необходимо войти в систему