Problem - 1398C - Codeforces
解析:
可以写出 sum[ j ] - sum[ i ] = j - i +1,对其移项得 sum[ j ] - j = sum[ i ] - (i - 1),问题转换为有多少个前缀和相等,则用map遍历统计一遍即可。
注意,当sum[ j ] - j = 0时,说明 1 到 j 区间也符合题意,但是却计算不进去,所以开始令mp[ 0 ] = 1
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int t,n,x,sum[N],res;
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld",&n);
map<int,int>mp;
mp[0]=1,res=0;
for(int i=1;i<=n;i++){
scanf("%1lld",&x);
sum[i]=sum[i-1]+x;
res+=mp[sum[i]-i]++;
}
printf("%lld\n",res);
}
return 0;
}