学习到的内容: 一种常用的二进制串处理方法
解题方法
把0看成-1, 求一个前缀和. [l,r]内01数量相等则等价于pre[r] == pre[l - 1]
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
void solve(){
string s;
cin >> s;
const int n = s.length();
vector<int> pre(n + 1);
s = ' ' + s;
for(int i = 1; i <= n; i++) {
pre[i] = pre[i - 1] + (s[i] == '1' ? 1 : -1);
}
vector<long long> f(2 * n + 10);
long long ans = 0;
//一种值得学习的方法
for(int i = 0; i <= n; i++) {
ans = (ans + f[pre[i] + n] * 1ll * (n - i + 1) % mod) % mod;
f[pre[i] + n] += i + 1;
}
cout << ans << endl;
}
int main(){
int T = 1;
cin >> T;
while(T--) solve();
return 0;
}