题解:CF1830C Hyperregular Bracket Strings
我们可以利用卡特兰数在
观察到:在最终合法的括号序列中,任意一对匹配的括号必须被完全相同的区间集合包含。这是因为,若某个区间包含了其中一个括号,则它必须同时包含与之匹配的另一个括号,否则该区间内的子串无法形成合法括号序列。因此,我们要找到被包含区间集合一样的点。
可以用前缀异或和(类似哈希):
- 为每个区间随机一个值
w_i 。 - 创建一个数组代表前缀异或和
v[1 \dots n] 。 - 对于每个区间
[l_i, r_i] : -
- 计算前缀异或
s_i = \bigoplus_{j=1}^{i} v[j] ,则s_i 即为位置i 的哈希值,表示包含i 被包含区间的w_i 的异或和。 - 统计每个哈希值出现的次数,每个哈希值对应的数量就是要用卡特兰数求合法括号串的长度。
由于随机权值,不同区间集合哈希碰撞的概率极低,可以忽略(如果觉得不保险,可以随机两个值)。
时间复杂度为