307703: CF1399D. Binary String To Subsequences

Memory Limit:256 MB Time Limit:2 S
Judge Style:Text Compare Creator:
Submit:0 Solved:0

Description

Binary String To Subsequences

题意翻译

对于长度为 $n$,只包含 $0$ 和 $1$ 的一个字符串 $s$,把它拆成 $k$ 个新字符串,使得: - 每个新字符串是 $s$ 的一个**子序列**; - $s$ 的每一个字符在这 $k$ 个新字符串中出现且仅出现**一次**; - 对于每一个新字符串,相邻两个字符**不同**(例如 `010101…`,`101010…`)。 求出 $k$ 的最小值。 输入:$t$ 组数据($1\le t\le 2\times 10^4$),对于每组数据,第一行一个整数 $n$($1\le n\le 2\times 10^5$),第二行一个 01 字符串 $s$。保证所有数据 $n$ 的总和小于 $2\times 10^5$。 输出:对于每组数据,第一行是 $k$ 的最小值,第二行 $n$ 个整数,第 $i$ 个整数 $a_i$ 表示 $s_i$ 所在新字符串的编号($1\le a_i\le k$)。如有多解,输出任意一个即可。

题目描述

You are given a binary string $ s $ consisting of $ n $ zeros and ones. Your task is to divide the given string into the minimum number of subsequences in such a way that each character of the string belongs to exactly one subsequence and each subsequence looks like "010101 ..." or "101010 ..." (i.e. the subsequence should not contain two adjacent zeros or ones). Recall that a subsequence is a sequence that can be derived from the given sequence by deleting zero or more elements without changing the order of the remaining elements. For example, subsequences of "1011101" are "0", "1", "11111", "0111", "101", "1001", but not "000", "101010" and "11100". You have to answer $ t $ independent test cases.

输入输出格式

输入格式


The first line of the input contains one integer $ t $ ( $ 1 \le t \le 2 \cdot 10^4 $ ) — the number of test cases. Then $ t $ test cases follow. The first line of the test case contains one integer $ n $ ( $ 1 \le n \le 2 \cdot 10^5 $ ) — the length of $ s $ . The second line of the test case contains $ n $ characters '0' and '1' — the string $ s $ . It is guaranteed that the sum of $ n $ does not exceed $ 2 \cdot 10^5 $ ( $ \sum n \le 2 \cdot 10^5 $ ).

输出格式


For each test case, print the answer: in the first line print one integer $ k $ ( $ 1 \le k \le n $ ) — the minimum number of subsequences you can divide the string $ s $ to. In the second line print $ n $ integers $ a_1, a_2, \dots, a_n $ ( $ 1 \le a_i \le k $ ), where $ a_i $ is the number of subsequence the $ i $ -th character of $ s $ belongs to. If there are several answers, you can print any.

输入输出样例

输入样例 #1

4
4
0011
6
111111
5
10101
8
01010000

输出样例 #1

2
1 2 2 1 
6
1 2 3 4 5 6 
1
1 1 1 1 1 
4
1 1 1 1 1 2 3 4

Input

题意翻译

对于长度为 $n$,只包含 $0$ 和 $1$ 的一个字符串 $s$,把它拆成 $k$ 个新字符串,使得: - 每个新字符串是 $s$ 的一个**子序列**; - $s$ 的每一个字符在这 $k$ 个新字符串中出现且仅出现**一次**; - 对于每一个新字符串,相邻两个字符**不同**(例如 `010101…`,`101010…`)。 求出 $k$ 的最小值。 输入:$t$ 组数据($1\le t\le 2\times 10^4$),对于每组数据,第一行一个整数 $n$($1\le n\le 2\times 10^5$),第二行一个 01 字符串 $s$。保证所有数据 $n$ 的总和小于 $2\times 10^5$。 输出:对于每组数据,第一行是 $k$ 的最小值,第二行 $n$ 个整数,第 $i$ 个整数 $a_i$ 表示 $s_i$ 所在新字符串的编号($1\le a_i\le k$)。如有多解,输出任意一个即可。

加入题单

算法标签: