CF1097C Yuhao and a Parenthesis
题目描述
有一天,Yuhao 遇到了一个关于判断括号序列是否合法的问题。
括号序列是由左括号和右括号组成的任意非空序列。如果可以通过在该序列中插入字符 “+” 和 “1” 得到一个合法的算术表达式,则称该括号序列为合法括号序列。例如,序列 “(())()”、“()” 和 “(()(()))” 是合法的,而 “)(”、“(()” 和 “(()))(” 不是合法的括号序列。
Yuhao 觉得这个问题太简单了,于是他决定让问题变得更难。现在给你许多(不一定合法的)括号序列。你的任务是将其中的一些括号序列两两配对,使得每个括号序列最多只出现在一个配对中,并且每对配对中两个括号序列拼接后的结果是一个合法的括号序列。目标是使配对的数量尽可能多。
然而,这个问题对 Yuhao 来说太难了。你能帮他解决这个问题吗?
输入格式
第一行包含一个整数 $n$($1 \leq n \leq 10^5$),表示括号序列的数量。
接下来的 $n$ 行,每行包含一个括号序列——一个只由 “(” 和 “)” 组成的非空字符串。
所有括号序列的长度之和不超过 $5 \cdot 10^5$。
注意,一个括号序列在输入中可能出现多次。在这种情况下,你可以分别使用每一个副本。还要注意,输入字符串出现的顺序无关紧要。
输出格式
输出一个整数,表示在满足题目条件的情况下,最多可以配对的数量。
说明/提示
在第一个样例中,最优的做法是构造两对配对:“(())()” 和 “()”。
由 ChatGPT 4.1 翻译