P12729 [KOI 2021 Round 2] 最长公共括号子串

题目背景

试题来源:。中文翻译做了少量本土化修改。 按照[署名—非商业性使用—相同方式共享 4.0 协议国际版](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans)进行授权。

题目描述

给定两个仅由左括号 `(` 和右括号 `)` 组成的字符串 $A$ 和 $B$。 我们定义 $S(A, B)$ 为以下所有字符串的集合: - 是 $A$ 的子串; - 是 $B$ 的子串; - 并且是一个**合法括号序列**; - 集合中元素互不相同。 请你判断 $S(A, B)$ 是否为空集。如果不是,请计算出 $S(A, B)$ 中最长字符串的长度。 你需要解决一个输入中给出的 $T$ 个测试用例。 ### 合法括号序列的定义 合法括号序列的定义如下: - 单独的一对括号 `()` 是合法括号序列; - 若 $X$ 是合法括号序列,则用括号将其包围后的 $(X)$ 也是合法括号序列; - 若 $X$ 和 $Y$ 都是合法括号序列,则其连接后的 $XY$ 也是合法括号序列; - 所有合法括号序列都只能通过以上三种规则构造。 例如:`((()(())))` 和 `(())()()` 是合法括号序列,而 `(()` 和 `)((()()` 都不是合法括号序列。 ### 子串的定义 给定一个长度为 $l$ 的字符串 $s$,以及满足 $1 \leq i \leq j \leq l$ 的两个整数 $i$ 和 $j$,则 $s[i..j]$ 表示从第 $i$ 个字符开始到第 $j$ 个字符为止的连续子串。 例如若 $s = \texttt{()(()()}$,则 $s[3..5] = \texttt{(()}$,$s[4..7] = \texttt{()()}$,因此 `(()` 和 `()()` 都是该字符串的子串。但 `)()(` 不是其子串。

输入格式

第一行包含一个整数 $T$,表示测试用例数量。 接下来 $T$ 行,每行由两个字符串 $A$ 和 $B$ 组成,中间以一个空格隔开,表示一个测试用例。

输出格式

对于每个测试用例,按顺序输出一行: - 若 $S(A, B)$ 是空集,输出 $0$ - 否则,输出 $S(A, B)$ 中最长字符串的长度

说明/提示

**约束条件** 设 $\sum |A|$ 表示输入中所有测试用例的字符串 $A$ 的总长度之和,$\sum |B|$ 定义相同。 - $1 \leq T \leq 500\,000$ - 每个字符串 $A$ 和 $B$ 均由 `'('` 和 `')'` 构成,长度均不少于 1 - $\sum |A| \leq 500\,000$ - $\sum |B| \leq 500\,000$ **子任务** 1. (5 分)$\sum |A| \leq 100$,$\sum |B| \leq 100$ 2. (13 分)$\sum |A| \leq 1\,000$,$\sum |B| \leq 1\,000$ 3. (23 分)$\sum |A| \leq 10\,000$,$\sum |B| \leq 10\,000$ 4. (17 分)所有测试用例中均满足 $A = B$ 5. (42 分)无额外约束条件