https://ac.nowcoder.com/acm/contest/11210/G
思路
需要处理 环 和 数组和部分之和为 0的问题
易想到 前缀和+ 开二倍长度数组 处理
考虑时间复杂度是On^2 会被卡死 所以我们需要换一种做法
因此经过思考 不难发现
-----------------处理区间和-------------------
我们可以每次都将 区间 的前i项和 进行处理
并且映射,如果对于这种区间存在重复
那么就说明存在一个区间是总和为0的
所以区间和的问题就可以通过映射来处理,
即两个前缀相同的区间 中间存在一个和为0的区间
-----------------处理区间和-------------------
-----------------处理环问题-------------------
因为题目中的关键句 “保证数组元素之和为零”
因此环问题,
我们不难发现
其实只需要考虑首尾是否的和是否为0即可
但是我们其实在处理区间和的时候
我们就已经可以把首尾这种情况给安排上了
只需要对答案进行++即可
Code:
#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
int main()
{
int t;
cin>>t;
while(t -- )
{
int n;
cin>>n;
int m = 0;
int ans = 0;
mp.clear();
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
m+=x;
mp[m]++;
ans=max(ans,mp[m]);
}
cout<<ans<<endl;
}
return 0;
}