#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
long long arr[200005];
long long s[200005];
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
int flag = 0;
int ans = 0;
int sum = 0;
int add = 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &arr[i]);
s[i] = (arr[i] + s[i - 1]);
if (flag == 0 && arr[i] == 0)
{
ans = i;
flag = 1;
}
}
int j;
//统计第一个 arr[i]==0 之前的前缀和为0的个数add
if(ans==0) ans=n+1; //可能不存在arr[i]==0,此时需要遍历整个数组
for (int i = 1; i < ans; i++)
{
if (s[i] == 0)
add++;
}
//统计[ 第一个arr[i]==0, 第二个arr[i]==0 )之间前缀和s[i]出现次数最多的数(如x),让arr[i]=-x,下一个arr[i]==0以此类推,方便理解,可认为下一个arr[i]先+x,抵消了前一个arr[i]的-x,这样下一个arr[i]及之后的前缀和就不发生改变.
for (int i = 1; i <= n; i++)
{
int eve = 0;
if (arr[i] == 0)
{
for (j = i + 1; j <= n; j++)
{
if (arr[j] == 0)
break;
}
sort(s + i, s + j);
for (int p = i; p < j; p++)
{
int q = p;
while (q + 1 < j && s[q] == s[q + 1])
q++;
eve = max(eve, q - p + 1);
p = q;
}
sum += eve;
i = j - 1;
}
}
sum += add; //最后别忘记加上add
printf("%d\n", sum);
}
system("pause");
return 0;
}