Олимпиадный тренинг

Задача . F. Разбиение двоичной строки


Назовем строку \(t\), состоящую из символов 0 и/или 1, красивой, если количество вхождений символа 0 в этой строке не превышает \(k\), либо количество вхождений символов 1 в этой строке не превышает \(k\) (либо выполняются оба условия). Например, если \(k = 3\), строки 101010, 111, 0, 00000, 1111111000 являются красивыми, а строки 1111110000, 01010101 не являются красивыми.

Вам дана строка \(s\). Вам необходимо разбить ее на минимально возможное количество красивых строк, т. е. найти последовательность строк \(t_1, t_2, \dots, t_m\) такую, что все \(t_i\) были красивыми, \(t_1 + t_2 + \dots + t_m = s\) (где \(+\) — оператор конкатенации), а \(m\) минимально возможно.

Для каждого \(k\) от \(1\) до \(|s|\) найдите минимально возможное количество строк на которое можно разбить заданную строку \(s\) (т. е. минимально возможное \(m\) в разбиении).

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

Единственная строка содержит одну строку \(s\) (\(1 \le |s| \le 2 \cdot 10^5\)). Каждый символ \(s\) является либо 0, либо 1.

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

Выведите \(|s|\) целых чисел. \(i\)-е целое число должно быть равно минимальному количеству строк в разбиении \(s\), когда \(k = i\).


Примеры
Входные данныеВыходные данные
1 00100010
2 1 1 1 1 1 1 1
2 1001011100
3 2 2 2 1 1 1 1 1 1

time 2000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя