根据题意, 需要我们找出有多少对区间 [l,r]使得 A[l...r] 中 1 的个数为 S 。最简单的方法就是通过枚举 l,r 区间并计算, 这样的复杂度是 O(n^2)
现在我们用前缀和的思想来解决这道题目, 我们记录 cnt[i] 是 [1,i] 中 1 的个数,那么对于第 i 个位置, 我们有 cnt[i] 个 1 , 我们只需要找到前面有多少个位置 j(j<i) ,使得 cnt[i]−cnt[j]==S, 那么对于 i 位置来说就有多少个区间满足 1 的个数为 S 个。
所以我们只需要用一遍循环,用变量 sum维护当前到第 i 个位置有多少个 1 ,只需要找到 cnt[sum−S]加入答案即可。