题意:
给一串数字,里面只包含0 -1 1三种数字。
问和为0的最长连续子串。
思路:
遍历一遍,求每个i的sum[i],代表从第一个数字到这个数字的和。
显然如果sum[i]=sum[j],则从i+1到j这j-i个数字的和=0。即次数所求的D=j-i-1。
#include<iostream>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int N=50005;
int n;
int data[N];
int pos[N];
int neg[N];
int mx;
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
mx=0;
memset(pos,-1,sizeof(pos));
memset(neg,-1,sizeof(neg));
pos[0]=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",data+i);
for(int i=1;i<=n;i++)
{
data[i]+=data[i-1];
if(data[i]>=0)
{
if(pos[data[i]]<0)
{
pos[data[i]]=i;
}
else
{
mx=max(mx,i-pos[data[i]]);
}
}
else
{
if(neg[-data[i]]<0)
{
neg[-data[i]]=i;
}
else
{
mx=max(mx,i-neg[-data[i]]);
}
}
}
if(mx>1)
printf("%d\n",mx-1);
else
printf("-1\n");
}
}