括号洗牌(Shuffle)

题目描述

乐柠兔有一个只包含左括号 ( 和右括号 ) 的字符串 ss

一个括号序列被称为合法括号序列,当且仅当它满足:

  1. 整个序列中左括号数量等于右括号数量;
  2. 任意前缀中左括号数量不少于右括号数量。

现在定义一种“括号洗牌”操作。

对于字符串 ss 中的每一个字符,计算它前面所有字符组成的前缀的括号平衡值。括号平衡值定义为:

左括号数量右括号数量\text{左括号数量}-\text{右括号数量}

也就是说,对于第 ii 个字符,需要记录三项信息:

  1. ii 个字符前面的前缀平衡值;
  2. 字符的位置 ii
  3. 字符本身。

接下来,将所有字符按照如下规则重新排序:

  1. 前缀平衡值较小的字符排在前面;
  2. 若前缀平衡值相同,则原位置较大的字符排在前面。

排序后,按照新的顺序依次取出字符,得到的新字符串就是 ss 的括号洗牌结果。

给定一个非空合法括号序列 ss,请输出它的括号洗牌结果。

输入格式

输入一行一个字符串 ss

保证 ss 是一个非空合法括号序列。

输出格式

输出一行一个字符串,表示 ss 的括号洗牌结果。

样例

样例输入 #1

(()(()))

样例输出 #1

()(()())

样例解析

对每个字符记录“前缀平衡值、位置、字符”后,可以得到:

前缀平衡值 00 11 22 11 22 33 22 11
位置 11 22 33 44 55 66 77 88
字符 ( ) ( )

按照前缀平衡值从小到大排序,若相同则按位置从大到小排序,字符顺序变为:

( ) ( ( ) ( ) )

所以输出 ()(()())

数据范围与约定

M=sM = |s| ,对于 100%100\% 的数据,保证:

  • 2s5×1052 \le |s| \le 5 \times 10^5
  • ss 只包含字符 ()
  • ss 是合法括号序列。
测试点编号 分值 具体限制变量 特殊性质
131\sim 3 1515 M10M \le 10
464\sim 6 M100M \le 100 A
797\sim 9 M1000M \le 1000 B
101210\sim 12 M104M \le 10^4
131613\sim 16 2020 M105M \le 10^5
172017\sim 20 M5×105M \le 5 \times 10^5

特殊性质说明:

  • A:ss 形如若干个 () 拼接而成;
  • B:ss 形如若干个左括号后接相同数量的右括号。