#P17848. 豚豚和兔兔的配对问题
豚豚和兔兔的配对问题
题目描述
今天是个特别的日子。无数只豚豚和兔兔结伴来到字串符的世界玩耍。每只兔兔会和最近的豚豚配对然后找上一个未配对的豚豚和与他匹配的兔兔一起玩。这实在太复杂了,于是我们把这个配对问题抽象成一个括号字串符交由屏幕前聪明的你来解决!
:::align{center}

严肃的豚豚和兔兔 :::
给定一个长度为 的括号字符串 ,其中每个字符都是 ( 或 )。字符串 一定合法括号序列。字符串中的位置从 开始编号。
一个括号序列是合法的,当且仅当它满足以下两个条件:
- 左括号与右括号的数量相同;
- 任意前缀中,左括号的数量都不少于右括号的数量。
原字符串中的匹配关系按以下规则确定:从左到右扫描字符串,每个右括号与它之前最近的、尚未匹配的左括号匹配。如果不存在这样的左括号,则该右括号未匹配。因为保证原括号串合法,每个括号必定存在匹配。
每个位置 有一个非负整数权值 。另外,给定一个非负整数外部权值 。
子串的价值
考虑一个非空合法括号子串 。
如果原字符串中存在一对匹配括号,其左右端点分别为 和 ,且满足:
则称这对括号严格包围该子串。
如果存在严格包围该子串的匹配括号对,则选择其中最内层的一对,即左端点 最大的一对。该子串的价值为:
其中 表示按位异或。
如果不存在严格包围该子串的匹配括号对,则该子串的价值为 。
匹配关系始终以原字符串为准。包围子串的括号可以位于查询区间外,不合法的括号子串不提供贡献。
例如,对于字符串 (()()):
- 子串 为
(),其价值为 ; - 子串 为
()(),其价值也为 ; - 整个字符串 的价值为 。
对于字符串 ((),位置 的左括号未匹配,因此子串 ,即 (),的价值为 。
操作
你需要处理 次操作:
1 p v:将位置 的权值 修改为 ;2 l r:求所有完全位于区间 内的非空合法括号子串的价值之和。
对于查询操作,需要统计的子串 必须满足:
输入格式
第一行包含三个整数 (),(),(),分别表示字符串长度、操作次数和外部权值。
第二行包含一个长度为 的字符串 ,其中每个字符都是 ( 或 )。保证 是合法括号序列。
第三行包含 个整数 ,依次表示每个字符位置的初始权值。
接下来 行,每行描述一次操作,格式为以下两种之一:
1 p v:将位置 ()的权值修改为 ();2 l r:查询区间 ()内所有非空合法括号子串的价值之和。
输出格式
对于每次查询操作,输出一行一个整数,表示符合条件的所有非空合法括号子串的价值之和。
如果不存在符合条件的子串,输出 。
6 7 2
(()())
1 0 0 0 0 4
2 1 6
2 2 5
1 6 7
2 1 6
2 3 4
1 1 3
2 2 5
17
15
20
0
12
提示
初始时,外层匹配括号的左右端点分别为 和 ,其权值异或为
所有非空合法括号子串及其价值如下:
- 子串 为
(),价值为 ; - 子串 为
(),价值为 ; - 子串 为
()(),价值为 ; - 子串 为
(()()),没有被任何匹配括号对严格包围,价值为 。
因此,第一次查询的答案为:
第二次查询的区间为 ,只统计前三个子串,答案为 。虽然包围它们的括号位于查询区间外,但仍然决定这些子串的价值。
将 修改为 后,外层匹配括号的权值异或变为:
此时,查询整个字符串得到的答案为:
区间 对应的子串为 )(,不存在非空合法括号子串,因此答案为 。
随后将 修改为 ,外层匹配括号的权值异或变为:
最后一次查询的区间为 ,答案为: