#P2792. Brackets Removal

Brackets Removal

描述

考虑由小写字母 "a" 到 "z" 表示的变量组成的算术表达式;

包含四种二元算术运算:加法(++)、减法(-)、乘法(*)和除法(//),以及圆括号"(("和"))"。运算的优先级遵循常规规则——乘法和除法的优先级最高,加法和减法的优先级最低。

相同优先级的运算从左到右计算(例如,ab+c=(ab)+ca - b + c = (a - b) + c)。

因此,表达式的语法如下:

<表达式> --> <项> | <表达式> + <项> | <表达式> - <项>  
<项> --> <因子> | <项> * <因子> | <项> / <因子>  
<因子> --> <变量> | (<表达式>)  
<变量> --> a | b | ... | z  

你的任务是重写给定的表达式,使其语义不变,但圆括号的数量最少。

你可以移除任何不影响运算顺序的多余括号,例如:
(a+b)+(c)a+b+c(a + b) + (c) \Rightarrow a + b + c
(ab)/(c)ab/c(a * b)/(c) \Rightarrow a * b/c

并且可以通过以下规则重写表达式:

  1. 如果 AABB 是任意表达式,可以将 A+(B)A + (B) 改为 A+BA + B。例如:
    $a - g/h + (b + c - d + e * (f + h - i)) \Rightarrow a - g/h + b + c - d + e * (f + h - i)$

  2. 如果 AABB 是任意表达式,可以将 A(B)A - (B) 改为 ABA - B',其中 BB' 是通过将 BB 中所有最外层的 ++- 互换得到的。例如:
    $a - g/h - (b + c - d + e * (f + h - i)) \Rightarrow a - g/h - b - c + d - e * (f + h - i)$

  3. 如果 AABB 是任意项,可以将 A(B)A * (B) 改为 ABA * B。例如:
    $x/(y + z) * (a * (b - c)/d/(e/f)) \Rightarrow x/(y + z) * a * (b - c)/d/(e/f)$

  4. 如果 AABB 是任意项,可以将 A/(B)A / (B) 改为 A/BA / B',其中 BB' 是通过将 BB 中所有最外层的 *// 互换得到的。例如:
    $x/(y + z)/(a * (b - c)/d/(e/f)) \Rightarrow x/(y + z)/a/(b - c) * d * (e/f)$

你可以根据需要多次应用上述转换和移除多余括号,直到表达式的圆括号数量最少。

输入
输入包含一行表达式。表达式不包含前导、尾随或内部的空格,且最多由1000个字符组成。

输出
输出一行重写后的表达式,圆括号数量最少。不要输出任何空格。

输入数据 1

((a-b)-(c-d)-(z*z*g/f)/(p*(t))*((y-u)))

输出数据 1

a-b-c+d-z*z*g/f/p/t*(y-u)

来源
Northeastern Europe 2005