1600*C. Good Subarrays(找规律&&前缀和)

Problem - 1398C - Codeforces

1600*C. Good Subarrays(找规律&&前缀和)_第1张图片

1600*C. Good Subarrays(找规律&&前缀和)_第2张图片

解析:

        可以写出 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);
		mapmp;
		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;
}

你可能感兴趣的:(codeforces,c语言,算法,开发语言,数据结构,c++,前缀和)