CF1660F2 Promising String (hard version)

题目描述

如果一个非空字符串包含了相同个数的加号与减号,我们把它称之为一个平衡字符串。 比如`+--+`,`++-+--`都是平衡的,而字符串`+--`,`--`,` `都不是平衡的。 如果一个字符串可以通过几个(可以是$0$个)操作而变得平衡,我们称它是有希望的。具体操作为: 把两个相邻的减号替换为一个加号 显然所有的平衡字符串都是有希望的,不过不是所有有希望的字符串都是平衡的。比如字符串`-+---`是一个有希望的字符串。因为 你可以把两个相邻的减号替换为一个加号从而达到一个平衡字符串`-++-`或`-+-+` 对于一个给定的字符串$s$,你要求出有它多少个非空子串是有希望的。如果一个子串在$s$中出现了多次,我们也要计算多次

输入格式

第一行输入一个正整数$t$($1 \leq t \leq 10^4$),代表有多少个测试数据 对于每一个测试数据,输入两行。 第一行一个正整数$n$($1 \leq n \leq 2 \times 10^5$),表示字符串$s$的长度 第二行输入一个字符串$s$,仅由`+`,`-`构成 保证对于所有测试数据,$n$的和不会超过$2 \times 10^5$

输出格式

对于每一个输出数据,输出它多少个非空子串是有希望的。

说明/提示

The following are the promising substrings for the first three test cases in the example: 1. $ s[1 \dots 2] $ ="+-", $ s[2 \dots 3] $ ="-+"; 2. $ s[1 \dots 2] $ ="-+", $ s[2 \dots 3] $ ="+-", $ s[1 \dots 5] $ ="-+---", $ s[3 \dots 5] $ ="---"; 3. $ s[1 \dots 3] $ ="---", $ s[2 \dots 4] $ ="---".