P12727 [KOI 2021 Round 2] 公共括号子串字典序
题目背景
试题来源:。中文翻译做了少量本土化修改。
按照[署名—非商业性使用—相同方式共享 4.0 协议国际版](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans)进行授权。
题目描述
给定两个只由左括号 `(` 与右括号 `)` 构成的字符串 $A$ 和 $B$,以及一个自然数 $K$。
我们定义集合 $S(A, B)$ 表示:所有既是字符串 $A$ 的子串、又是字符串 $B$ 的子串,并且是一个**合法括号序列**的不同字符串所组成的集合。
你的任务是判断 $S(A, B)$ 的大小是否不少于 $K$。如果不小于,则输出 $S(A, B)$ 中**按字典序排列后的第 $K$ 个字符串**;否则,输出 $-1$。
你需要在一个输入数据中处理 $T$ 个测试用例。
### 合法括号序列的定义
一个合法括号序列定义如下:
- 单个括号对构成的字符串 `()` 是合法括号序列。
- 若 $X$ 是合法括号序列,则 $(X)$ 也是合法括号序列。
- 若 $X$ 和 $Y$ 都是合法括号序列,则将它们连接而成的 $XY$ 也是合法括号序列。
- 所有合法括号序列都只能通过上述三条规则构造。
例如:`((()(())))` 和 `(())()()` 是合法括号序列,而 `(()` 和 `)((()()` 都不是。
### 子串的定义
给定长度为 $l$ 的字符串 $s$ 和两个整数 $i, j$,其中 $1 \leq i \leq j \leq l$,则 $s[i..j]$ 表示从 $s$ 的第 $i$ 个字符到第 $j$ 个字符组成的子字符串。
例如若 $s = \texttt{()(()()}$,则 $s[1..5] = \texttt{(()(}$,$s[1..7] = \texttt{()(()()}$,因此 `(()(` 和 `()(()()` 都是 $s$ 的子串。但 `)()(` 不是该字符串的子串。
### 字典序的定义
给定两个字符串 $s_1[1..l_1]$ 和 $s_2[1..l_2]$,我们说 $s_1$ 在字典序上早于 $s_2$,当且仅当满足以下任一条件:
- $s_1$ 是 $s_2$ 的前缀,且 $l_1 < l_2$
- 存在最小的 $i$ 满足 $s_1[i] \ne s_2[i]$ 且 $s_1[i] < s_2[i]$
在本题中,左括号 `'('` 比右括号 `')'` 更小,即 `'(' < ')'`。这与 C++、Java 和 Python 中的字符串比较方式一致。
输入格式
第一行包含一个整数 $T$,表示测试用例的个数。
接下来的 $T$ 行中,每行描述一个测试用例,包含字符串 $A$、字符串 $B$ 和整数 $K$,它们之间用一个空格隔开。
输出格式
对于每个测试用例,按输入顺序依次输出一行:
- 若 $|S(A, B)| < K$,输出 $-1$
- 否则,输出 $S(A, B)$ 中字典序第 $K$ 小的字符串
说明/提示
**约束条件**
设 $\sum |A|$ 表示一个输入数据中所有测试用例的字符串 $A$ 的总长度之和,$\sum |B|$ 类似。
- $1 \leq T \leq 500\,000$
- 每个字符串 $A$ 和 $B$ 均由 `'('` 和 `')'` 组成,且长度均不少于 1
- $1 \leq K \leq 10^{18}$
- $\sum |A| \leq 500\,000$
- $\sum |B| \leq 500\,000$
**子任务**
1. (4 分)$\sum |A| \leq 100$,$\sum |B| \leq 100$
2. (11 分)$\sum |A| \leq 1\,000$,$\sum |B| \leq 1\,000$
3. (16 分)$\sum |A| \leq 10\,000$,$\sum |B| \leq 10\,000$,且 $A = B$,$K = 1$
4. (25 分)$\sum |A| \leq 10\,000$,$\sum |B| \leq 10\,000$
5. (10 分)$A = B$,$K = 1$
6. (12 分)$A = B$
7. (9 分)$K = 1$
8. (13 分)无额外约束条件