#P6864. [RC-03] 记忆

[RC-03] 记忆

题目背景

小 W 想写一个关于记忆的题目背景,但是他忘记了。

题目描述

有一个括号串 SS,一开始 SS 中只包含一对括号(即初始的 SS()),接下来有 nn 个操作,操作分为三种:

  1. 在当前 SS 的末尾加一对括号(即 SS 变为 S());

  2. 在当前 SS 的最外面加一对括号(即 SS 变为 (S));

  3. 取消第 xx 个操作,即去除第 xx 个操作造成过的一切影响(例如,如果第 xx 个操作也是取消操作,且取消了第 yy 个操作,那么当前操作的实质就是恢复了第 yy 个操作的作用效果)。

每次操作后,你需要输出 SS 的能够括号匹配的非空子串(子串要求连续)个数。

一个括号串能够括号匹配,当且仅当其左右括号数量相等,且任意一个前缀中左括号数量不少于右括号数量。

输入格式

第一行:一个整数 nn,表示操作的个数。

接下来 nn 行:每行先有一个整数 opop,表示操作的种类:

op=1op=1,则表示执行了操作 11

op=2op=2,则表示执行了操作 22

op=3op=3,接下来还有一个整数 xx,表示执行操作 33,取消了第 xx 个操作(操作按 11nn 编号,保证第 xx 个操作已发生),注意取消操作并不影响任何操作的编号,编号只取决于输入顺序。

输出格式

nn 行:第 ii 行输出一个整数 ansians_i,表示第 ii 次操作结束后整个括号串的括号匹配的非空子串个数。

6
1
2
3 1
1
3 3
3 5

3
4
2
4
6
4

10
1
2
2
3 2
1
3 3
3 6
1
2
1

3
4
5
4
6
6
6
9
10
12

提示

【样例 11 解释】

S[i,j]S[i,j] 表示从 SiS_iSjS_j 的子串(下标从 11 开始)。

一开始 SS(),每次操作后:

11 次操作后:SS()(),匹配的子串有 S[1,2]S[1,2]S[1,4]S[1,4]S[3,4]S[3,4],共 33 个。

22 次操作后:SS(()()),匹配的子串有 S[1,6]S[1,6]S[2,3]S[2,3]S[2,5]S[2,5]S[4,5]S[4,5],共 44 个。

33 次操作后:SS(()),匹配的子串有 S[1,4]S[1,4]S[2,3]S[2,3],共 22 个。

44 次操作后:SS(())(),匹配的子串有 S[1,4]S[1,4]S[1,6]S[1,6]S[2,3]S[2,3]S[5,6]S[5,6],共 44 个。

55 次操作后:SS(()())(),匹配的子串有 S[1,6]S[1,6]S[1,8]S[1,8]S[2,3]S[2,3]S[2,5]S[2,5]S[4,5]S[4,5]S[7,8]S[7,8],共 66 个。

66 次操作后:SS(())(),匹配的子串有 S[1,4]S[1,4]S[1,6]S[1,6]S[2,3]S[2,3]S[5,6]S[5,6],共 44 个。


【数据范围】

本题采用捆绑测试。

对于全部数据:1n2×1051\leq n\leq 2\times 10^5op{1,2,3}op\in \{1,2,3\}1xn1\leq x\leq n,一个操作在形式上最多只会被取消一次(即所有 xx 互不相同)。

子任务编号 nn\leq opop\in 分值
Subtask 1 100100 {1,2,3}\{1,2,3\} 1010
Subtask 2 10310^3
Subtask 3 10510^5 3030
Subtask 4 2×1052\times 10^5 {1,2}\{1,2\} 2020
Subtask 5 {1,2,3}\{1,2,3\} 3030