[C. Good Subarrays]
大致翻译:
题目大意:给定已知长度的序列,求区间和等于区间长度的子序列的个数
思路:可以将序列中的每一个数-1,这样当他们满足相加为0的时候便是他们的和等于区间长度的时候
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
int main(){
int t;
scanf("%d",&t);
while(t--){
string a;
int n;
cin>>n>>a;
map<int,int >mp;
ll ans=0,sum=0;
for(int i=0;i<n;i++){
sum+=a[i]-'0'-1;
if(sum==0) ans++;
ans+=mp[sum];
mp[sum]++;
}
printf("%lld\n",ans);
}
return 0;
}
一点解释:
ans+=mp[sum];mp[sum]++;
标记每次sum出现次数,当子序列相加等于前面所出现过的sum时说明后一段子序列相加为0;例如2,3,2,-1,-1;
sum=2+3=5;
sum=2+3+2-1-1=5;
说明2-1-1=0;
满足题目的要求