教练我也要玩崩铁
LuoFeng_Nanami · · 题解
我们不妨假设每次删去的,都是极长子串的第一个字符。
对于一个合法的串,显然它的所有前缀都是合法的。
考虑一个不合法的,以
这个串形如
并且我们还知道,从这个
接下来我们考虑如何刻画这个性质:
记
所以若
求
:::info[code]
cin >> _;
while(_--) {
cin >> str + 1;
int n = strlen(str + 1);
ll ans = 0;
F(i, 1, n)
sum[i] = sum[i - 1] + (str[i] == '0' ? -1 : 1);
F(i, 0, n) {
while(top && sum[i] > sum[stk[top]])
a[stk[top--]] = i;
stk[++top] = i;
}
while(top) a[stk[top--]] = n + 1;
F(i, 0, n) {
while(top && sum[i] < sum[stk[top]])
b[stk[top--]] = i;
stk[++top] = i;
}
while(top) b[stk[top--]] = n + 1;
F(i, 1, n) {
if(str[i] == '0')
ans += (ll)(a[i - 1] - i);
else ans += (ll)(b[i - 1] - i);
}
cout << ans << '\n';
}
:::