方法:先求前缀和,将pair<前缀和的值,前缀和标号i>加入multimap中,搜索每一种前缀和的lowerbound和upbound,计算两者之差,与前缀和为零的标号比较,取最大值。
#include<iostream>
#include<vector>
#include<hash_map>
#include<map>
using namespace std;
#define N
int main()
{
int c;
cin>>c;
int * a=new int[c];
int * sum=new int[c];
multimap<int,int> shuzu;
for(int i=0;i<c;++i)
cin>>a[i];
sum[0]=a[0];
for(int i=1;i<c;++i){
sum[i]=sum[i-1]+a[i];
shuzu.insert(pair<int,int>(sum[i],i));
}
typedef multimap<int,int>::iterator MIt;
MIt it1=shuzu.begin();
MIt it2=shuzu.begin();
int max=0;
int index1=0,index2=0;
while(it2!=shuzu.end())
{
int val=(*it1).first;
it1=shuzu.lower_bound(val);
it2=shuzu.upper_bound(val);
if(it2!=shuzu.end())
{
it2--;
if((*it2).first==0)
{
index1=-1;
index2=(*it2).second;
max=index2+1;
}
int lent=(*it2).second-(*it1).second;
if(lent>max)
{
max=lent;
index1=(*it1).second;
index2=(*it2).second;
}
it2++;
it1=it2;
}
}
for(int m=index1+1;m<=index2;++m)
cout<<a[m]<<" ";
return 0;
}