如果你 WA 的不明所以,而且只 AC 了 sub1 1,2 和 sub2 1,那么请检查你代码中对数组的清空是否取到了 n+n。
// Copyright 2023 Lotuses
#include <cstdio>
#include <cstring>
#include <vector>
#define int long long
const int maxn = 2e6 + 100;
char ch[maxn];
int a[maxn], s[maxn];
int t[4 * maxn];
signed main() {
#ifdef LOCAL
freopen(".in", "r", stdin);
freopen(".out", "w", stdout);
#endif
int T;
read(T);
while (T--) {
int n, ans = 0;
read(n);
scanf("%s", ch + 1);
s[1] = 0;
for (int i = 1; i <= n; i++) {
a[i] = ch[i] == '(' ? 1 : -1;
s[i + 1] = s[i] + a[i];
}
n++;
memset(t, 0, sizeof(int) * (n + n + 100)); // plz attention
for (int i = 1; i <= n; i++) {
t[s[i] + n]++;
}
for (int i = -n, cnt = 0, s = 0; i <= n; i++) {
for (int c = 1; c <= t[i + n]; c++, cnt++) {
s += i;
ans += (cnt + 1) * i - s;
debug(i, cnt + 1, s, ans);
}
}
ans += n * (n - 1) / 2;
// memset(t, 0, sizeof(t));
for (int i = 0; i <= n + n; i++) t[i] = 0;
for (int i = 1; i <= n; i++) {
ans -= i - t[s[i] + n - 1] - 1;
t[s[i] + n] = i;
}
// memset(t, 0, sizeof(t));
for (int i = 0; i <= n + n; i++) t[i] = n + 1;
for (int i = n; i >= 1; i--) {
ans -= t[s[i] + n - 1] - i - 1;
t[s[i] + n] = i;
}
memset(t, 0, sizeof(int) * (n + n + 100)); // plz attention
for (int i = 1; i <= n; i++) {
t[s[i] + n]++;
if (s[i] > s[i + 1]) {
ans += t[s[i] + n] * (t[s[i] + n] - 1) / 2;
t[s[i] + n] = 0;
}
}
for (int i = 1; i <= n; i++) {
ans += t[s[i] + n] * (t[s[i] + n] - 1) / 2;
t[s[i] + n] = 0;
}
writeln(ans);
}
return 0;
}