题意
在给定的数组中求最少插入多少个数才可使任意连续子串不为0
思路
由前缀和可知当s[i] == s[j - 1] ( j < i ) 时有子区间sum( i, j )为0
使用set记录每个出现的前缀和
一旦出现重复记录的情况就代表出现一个和为0的子区间
ans ++ 我们在当前点的前缀和前插入INF
则当前点之前的前缀和都不可能与后面点的前缀和相等
清空set
再插入当前点的前一个点的前缀和因为当前点可能同时是两个区间的头尾
插入当前的的前缀和
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, sum, x, ans;
signed main()
{
set<int> s;
cin >> n;
s.insert( 0 );
for( int i = 1; i <= n; i ++ )
{
cin >> x;
sum += x;
if( s.find( sum ) != s.end() )
{
ans ++;
s.clear();
s.insert( sum - x );
}
s.insert( sum );
}
cout << ans << endl;
}