CF1837D Bracket Coloring

题目描述

一个“正规括号序列”是指可以通过在原序列的括号之间插入字符 $1$ 和 $+$,将其转化为一个合法的算术表达式的括号序列。例如: - 括号序列 "()()" 和 "(())" 是正规括号序列(对应的表达式分别为 "(1)+(1)" 和 "((1+1)+1)"); - 括号序列 ")(", "(" 和 ")" 不是正规括号序列。 如果一个括号序列满足以下任一条件,则称其为“美丽括号序列”: - 它是一个正规括号序列; - 如果将该序列的字符顺序反转后,它变成了一个正规括号序列。 例如,括号序列 "()()"、"(())"、")))((("、"))()((" 都是美丽括号序列。 现在给定一个括号序列 $s$,你需要对其进行染色,要求如下: - 每个括号都要被染上一种颜色; - 每种颜色至少要染到一个括号; - 对于每种颜色,将所有染成该颜色的括号,按照它们在原序列中的顺序写出来,得到的括号序列必须是美丽括号序列。 请你用最少的颜色数对给定的括号序列 $s$ 进行染色,满足上述要求。如果无法做到,输出 $-1$。

输入格式

第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。 每个测试用例包含两行。第一行包含一个整数 $n$($2 \le n \le 2 \cdot 10^5$),表示括号序列的长度。第二行包含一个长度为 $n$ 的字符串 $s$,其中每个字符都是 "(" 或 ")"。 输入还满足:所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。

输出格式

对于每个测试用例,按如下要求输出答案: - 如果无法按照题意对括号进行染色,输出 $-1$; - 否则输出两行。第一行输出一个整数 $k$($1 \le k \le n$),表示所需的最小颜色数。第二行输出 $n$ 个整数 $c_1, c_2, \dots, c_n$($1 \le c_i \le k$),其中 $c_i$ 表示第 $i$ 个括号的颜色。如果有多种方案,输出任意一种均可。

说明/提示

由 ChatGPT 4.1 翻译