这题做得比较复杂。。应该有更好的做法
题目大意:
有一个括号序列,可以对其进行两种操作:
· 向里面加一个括号,可以在开头,在结尾,在两个括号之间加。
· 对当前括号序列进行循环移动,即把最后一个括号拿到开头来。
上述两种操作可以做任意次,要求添加最少的括号使得原序列变成一个合法括号序列。如果有多种可能,输出字典序最小的那一个。"(" < ")"。
题解:
首先计算左括号和右括号的数量,可以知道,不妨假设左括号的数量大于右括号
那么最少的方案就是在字符串右侧补充右括号,使得左括号的数量等于右括号的数量。
但是一个方案是否可行,要使得前面的每个前缀,都满足条件左括号的数量大于右括号
如果不满足,就循环移动即可,通过循环移动就一定会找到一个方案。
要输出字典序最小的方案,就需要后缀数组了
把字符串循环复制一遍,做后缀数组,那么就知道每个方案的排名
找最小且可行的方案输出即可。
另一种情况是左括号的数量小于右括号,也是同理的。
关于如何判断是否可行,这里是用的平衡树
写出每个位置的条件,每移动一次,对所有的条件影响都是相同的,所以用平衡树维护这些条件即可
#include #include #include #include #include