题目 20401

最长公共括号子串

查看题解 ↗GitHub ↗如何评测
题号
20401
时间限制
1000 ms
内存限制
256 MB
标签
比赛CSP-S
来源
CSP-S 国外模拟赛 30 - T3

第 3 题 最长公共括号子串 (longestcps)

时间限制 1.0 s · 空间限制 256 MB · 190 个测试点 · 全文比较(过滤行末空格及文末回车)

本题使用文件输入输出:输入文件 longestcps.in,输出文件 longestcps.out。

按照署名—非商业性使用—相同方式共享 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 \le i \le j \le l 的两个整数 ii 和 jj,则 s[i..j]s[i..j] 表示从第 ii 个字符开始到第 jj 个字符为止的连续子串。

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

输入格式

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

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

输出格式

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

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

样例

样例 1

输入:

文本
3
()((())) (()((())))()
))(()(((( )())))))(
())) )))))(())

输出:

文本
8
2
2

提示

约束条件

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

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

子任务

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

数据下载

题目 20401 的公开数据

正在读取文件列表…

常用命令

题目 20401 的 ROJ 命令

以下命令默认使用全局安装的 ROJ Skill,请在终端中直接执行;如果修改过 AGENT_HOME,请将命令中的 ~/.agents 替换为对应目录。