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

    ID: 14569 远端评测题 3000ms 1024MiB 尝试: 0 已通过: 0 显示难度省选/NOI− 上传者: 标签>2021后缀数组 SAKOI(韩国)

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

背景

试题来源:https://koi.or.kr/archives/。中文翻译做了少量本土化修改。

按照署名—非商业性使用—相同方式共享 4.0 协议国际版进行授权。

题目描述

给定两个仅由左括号 ( 和右括号 ) 组成的字符串 AA 和 BB。

我们定义 S(A,B)S(A, B) 为以下所有字符串的集合:

  • 是 AA 的子串;
  • 是 BB 的子串;
  • 并且是一个合法括号序列;
  • 集合中元素互不相同。

请你判断 S(A,B)S(A, B) 是否为空集。如果不是,请计算出 S(A,B)S(A, B) 中最长字符串的长度。

你需要解决一个输入中给出的 TT 个测试用例。

合法括号序列的定义

合法括号序列的定义如下:

  • 单独的一对括号 () 是合法括号序列;
  • 若 XX 是合法括号序列,则用括号将其包围后的 (X)(X) 也是合法括号序列;
  • 若 XX 和 YY 都是合法括号序列,则其连接后的 XYXY 也是合法括号序列;
  • 所有合法括号序列都只能通过以上三种规则构造。

例如:((()(()))) 和 (())()() 是合法括号序列,而 (() 和 )((()() 都不是合法括号序列。

子串的定义

给定一个长度为 ll 的字符串 ss,以及满足 1≤i≤j≤l1 \leq i \leq j \leq l 的两个整数 ii 和 jj,则 s[i..j]s[i..j] 表示从第 ii 个字符开始到第 jj 个字符为止的连续子串。

例如若 s=()(()()s = \texttt{()(()()},则 s[3..5]=(()s[3..5] = \texttt{(()},s[4..7]=()()s[4..7] = \texttt{()()},因此 (() 和 ()() 都是该字符串的子串。但 )()( 不是其子串。

输入格式

第一行包含一个整数 TT,表示测试用例数量。

接下来 TT 行,每行由两个字符串 AA 和 BB 组成,中间以一个空格隔开,表示一个测试用例。

输出格式

对于每个测试用例,按顺序输出一行:

  • 若 S(A,B)S(A, B) 是空集,输出 00
  • 否则,输出 S(A,B)S(A, B) 中最长字符串的长度
3
()((())) (()((())))()
))(()(((( )())))))(
())) )))))(())
8
2
2

提示

约束条件

设 ∑∣A∣\sum |A| 表示输入中所有测试用例的字符串 AA 的总长度之和,∑∣B∣\sum |B| 定义相同。

  • 1≤T≤500 0001 \leq T \leq 500\,000
  • 每个字符串 AA 和 BB 均由 '(' 和 ')' 构成,长度均不少于 1
  • ∑∣A∣≤500 000\sum |A| \leq 500\,000
  • ∑∣B∣≤500 000\sum |B| \leq 500\,000

子任务

  1. (5 分)∑∣A∣≤100\sum |A| \leq 100,∑∣B∣≤100\sum |B| \leq 100
  2. (13 分)∑∣A∣≤1 000\sum |A| \leq 1\,000,∑∣B∣≤1 000\sum |B| \leq 1\,000
  3. (23 分)∑∣A∣≤10 000\sum |A| \leq 10\,000,∑∣B∣≤10 000\sum |B| \leq 10\,000
  4. (17 分)所有测试用例中均满足 A=BA = B
  5. (42 分)无额外约束条件