C. Eugene and an array
题意
给你一个长度为n的数组,求不含和为0的子串的个数。
思路
前缀和 思维
前缀和 pre[i]=pre[j]意味着 ai+1∼aj这一段的和为0,则所求字符串不应该包含这段,令 p为 pre[i]所在的位置,则不包含子串和为0的个数为 i−(p+1)。
初始化 pos[0]=0。
map.count(key) 返回值为bool型,表示是否存在key。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,q,s,ans;
map<ll,ll> pos;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
pos[0]=0;
ll q=-1;
for(int i=1;i<=n;i++){
ll x;cin>>x;
s+=x;
if(pos.count(s)) q=max(q,pos[s]);
ans+=i-q-1;
pos[s]=i;
}
cout<<ans<<'\n';
return 0;
}