cf edu93 C
我们可以知道 题目要改为sum[i]-sum[j-1] = i-(j-1)成立的时候符合要求
将其变化为
sum[i]-i = sum[j-1]-(j-1)
所以就是看成 sum[i]-i的相等的个数
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
#define int long long
using namespace std;
int a[100005]={0};
signed main(){
int t,n;
string tmp;
cin >> t;
while(t--) {
cin >> n;
cin >> tmp;
a[0] =0;
map<int,int> mp;
for(int i=1;i<=tmp.size();i++){
a[i] = a[i-1]+tmp[i-1]-'0';
}
for(int i=1;i<=tmp.size();i++)
a[i]-=i;
long long sum =0;
for(int i=1;i<=n;i++){
mp[a[i]]++;
}
map<int, int>::iterator iter;
iter = mp.begin();
mp[0]++;
while(iter != mp.end()) {
long long ktt = iter->second*(iter->second-1)/2ll;
sum+=(ktt);
iter++;
// cout << iter->first << " " << iter->second << endl;
}
cout << sum << endl;
}
return 0;
}