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

    ID: 12508 Type: RemoteJudge 3000ms 1024MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>2021后缀数组 SAKOI(韩国)

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

题目背景

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

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

题目描述

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

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

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

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

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

合法括号序列的定义

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

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

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

子串的定义

给定一个长度为 ll 的字符串 ss,以及满足 1ijl1 \leq i \leq j \leq l 的两个整数 iijj,则 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 行,每行由两个字符串 AABB 组成,中间以一个空格隔开,表示一个测试用例。

输出格式

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

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

提示

约束条件

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

  • 1T5000001 \leq T \leq 500\,000
  • 每个字符串 AABB 均由 '('')' 构成,长度均不少于 1
  • A500000\sum |A| \leq 500\,000
  • B500000\sum |B| \leq 500\,000

子任务

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