传送门
题意:
找区间的和等于区间长度的个数
如果把数组的每个数都减1,那找的就是区间和为0的个数
思路:
求个前缀和,记录一下每个数出现的次数,每次加上该数在前面出现的次数即可(前面每出现一次,就会有一段区间和为0)
代码:
int t,n;
int a[MAXN];
ll sum[MAXN];
map<ll,ll>p;
int main()
{
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
char x;
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[i]=x-'0';
a[i]--;
sum[i]=sum[i-1]+a[i];
}
ll ans=0;
p[0]++;
for(int i=1;i<=n;i++){
ans+=p[sum[i]];
p[sum[i]]++;
}
p.clear();
cout<<ans<<endl;
}
return 0;
}