

解析:
可以写出 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
- 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;
- }