在银河中孤独摇摆
钦定首字符为
考虑把
这样枚举每一个子串直接 check,有
令原串的前缀和为
这样有时间复杂度
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i >= (b); --i)
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vec;
typedef array<int, 2> arr;
const int N = 1e7 + 5;
int n, a[N], s[N], r[N], st[N], tp; char c[N]; LL ans;
void Solve() {
F(i, 1, n + 1) {
while (tp > 0 && s[st[tp]] < s[i])
r[st[tp--]] = i;
st[++tp] = i;
}
while (tp) r[st[tp--]] = n + 2;
F(i, 1, n) ans += r[i] - i - 1;
}
void mian() {
cin >> c, n = strlen(c), ans = 0;
F(i, 1, n) a[i] = c[i - 1] - '0';
s[n + 1] = 0;
dF(i, n, 1) s[i] = s[i + 1] + (a[i] ? 1 : -1);
Solve();
dF(i, n, 1) s[i] = s[i + 1] + (a[i] ? -1 : 1);
Solve();
cout << ans << "\n";
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int _; cin >> _; while (_--) mian();
return 0;
}