CF1263E Editor
题目描述
开发一个文本编辑器是一个难题。你需要为文本编辑器实现一个括号着色的附加模块。
你的编辑器由一行无限长度的文本和一个光标组成,光标指向当前字符。请注意,光标只指向某个字符(而不是字符之间的空隙)。因此,它指向一个字符的下标。用户可以将光标向左或向右移动一个位置。如果光标已经在第一个(最左侧)位置,则不会再向左移动。
初始时,光标位于第一个(最左侧)字符。
此外,用户可以在光标当前指向的位置写入一个字母或括号(即 ( 或 ))。新写入的字符总是会覆盖该位置原有的字符。
你的编辑器必须检查当前这一行是否为正确的文本。如果其中的括号构成了正确的括号序列,则认为文本是正确的。
形式化地说,正确的文本(CT)需要满足以下规则:
- 任何没有括号的行都是 CT(该行可以包含空格);
- 如果字符串的第一个字符是 (,最后一个字符是 ),且中间的所有字符构成 CT,则整个字符串是 CT;
- 两个连续写成的 CT 也是 CT。
正确文本的示例:hello(codeforces)、round、((i)(write))edi(tor)s、( me)。错误文本的示例:hello)oops(、round)、((me)。
用户通过特殊命令操作编辑器。每个命令都有其对应的符号,写入该符号即可执行相应命令。
命令与字符的对应关系如下:
- L —— 光标向左移动一个字符(如果已经在第一个字符,则不移动);
- R —— 光标向右移动一个字符;
- 任意小写拉丁字母或括号(( 或 ))—— 在光标当前位置写入该字符。
为了更好地理解,请参考第一个样例及其下方的说明。
给定一个包含用户输入的字符的字符串。对于括号着色模块的工作,在每条命令执行后,你需要:
- 检查编辑器中的当前文本是否为正确文本;
- 如果是,输出为所有括号着色所需的最少颜色数。
如果两个括号对是嵌套关系(一个在另一个内部或反之),则这两个括号对必须涂成不同的颜色。如果两个括号对不是嵌套关系,则它们可以涂成相同或不同的颜色。例如,对于括号序列 ()(())()(),最少需要 $2$ 种颜色;对于括号序列 (()(()())())(()),最少需要 $3$ 种颜色。
编写一个程序,在处理每条命令后,输出最少颜色数。
输入格式
第一行包含一个整数 $n$($1 \le n \le 10^6$)—— 命令的数量。
第二行包含 $s$——命令序列。字符串 $s$ 由 $n$ 个字符组成。保证字符串中的所有字符都是有效命令。
输出格式
输出一行共 $n$ 个整数,第 $i$ 个数表示:
- 如果处理完前 $i$ 条命令后得到的文本不是正确文本,则输出 $-1$;
- 如果是正确文本,则输出最少需要的颜色数。
说明/提示
在第一个样例中,编辑器中的文本将依次变为:
1.
```
(
^
```
2.
```
(
^
```
3.
```
(a
^
```
4.
```
(a
^
```
5.
```
(ab
^
```
6.
```
(ab
^
```
7.
```
(ab)
^
```
8.
```
(ab)
^
```
9.
```
(a))
^
```
10.
```
(a))
^
```
11.
```
(())
^
```
由 ChatGPT 4.1 翻译