题意:
你有一个长度为nnn的字符串,其中仅含'0','1','2'三个字符。
你希望知道,这个字符串有多少个子串,满足该子串的'0','1','2'个数相等?
思路:
预处理到位置i之前有几个1,0,2.
枚举区间终点为i的有多少个区间个数相等,则需要知道i之前有多少个差值与i相同的。
map<pii,int>即可。
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int, int> pii;
#define int long long
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
string s;
int a[300005][5];
map<pii, int> mp;
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
cin >> s;
mp.clear();
s = '!' + s;
a[0][0] = 0;
a[0][1] = 0;
a[0][2] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 2; j++) {
a[i][j] = a[i - 1][j];
}
a[i][s[i] - '0']++;
}
int ans = 0;
mp[ {0, 0}] = 1;
for (int i = 1; i <= n; i++) {
int x = a[i][1] - a[i][0];
int y = a[i][2] - a[i][1];
ans += mp[ {x, y}];
mp[ {x, y}]++;
}
cout << ans << endl;
}
return 0;
}