#CF1919B. 正负号拆分

正负号拆分

B. 正负号拆分
时间限制:每个测试点 11
内存限制:256256 兆字节

给定一个长度为 nn 的字符串 ss,由字符 "+""-" 组成。
ss 表示一个长度为 nn 的数组 aa,定义如下:

  • si="+"s_i = \texttt{"+"},则 ai=1a_i = 1
  • si="-"s_i = \texttt{"-"},则 ai=1a_i = -1

你将通过以下过程计算你的罚分

  1. 将数组 aa 拆分成若干个非空数组 b1,b2,,bkb_1, b_2, \dots, b_k,满足 b1+b2++bk=ab_1 + b_2 + \dots + b_k = a(这里的 ++ 表示数组的连接)。
  2. 一个数组 cc(长度为 mm)的罚分定义为:p(c)=c1+c2++cmmp(c) = |c_1 + c_2 + \dots + c_m| \cdot m
  3. 总罚分为:p(b1)+p(b2)++p(bk)p(b_1) + p(b_2) + \dots + p(b_k)

如果你能最优地进行拆分,请输出你能获得的最小总罚分。


输入格式

每个测试包含多个测试用例。
第一行一个整数 tt1t10001 \le t \le 1000)——测试用例的数量。
每个测试用例两行:

  • 第一行一个整数 nn1n50001 \le n \le 5000)——字符串 ss 的长度。
  • 第二行一个字符串 sssi{+,-}s_i \in \{ \texttt{+}, \texttt{-} \}s=n|s| = n)。

注意:所有测试用例的 nn 之和没有限制。


输出格式

对于每个测试用例,输出一个整数,表示最小可能的罚分。


示例

输入:

5
1
+
5
-----
6
+-+-+-
10
--+++++++-
20
+---++++-+++++---++-

输出:

1
5
0
4
4

示例解释

第一个测试用例
a=[1]a = [1]
唯一拆分:([1])([1])
罚分:p([1])=1p([1]) = 1

第二个测试用例
a=[1,1,1,1,1]a = [-1, -1, -1, -1, -1]
拆分:([1],[1],[1],[1],[1])([-1],[-1],[-1],[-1],[-1])
罚分:1+1+1+1+1=51 + 1 + 1 + 1 + 1 = 5

第三个测试用例
a=[1,1,1,1,1,1]a = [1, -1, 1, -1, 1, -1]
拆分:([1,1,1,1],[1,1])([1, -1, 1, -1], [1, -1])
罚分:0+0=00 + 0 = 0