最长配对

最长配对

小b有一个01序列,她想找到一个最长的区间使得这个区间的01能两两配对,即0的个数和1的个数相等。求最长区间的长度。

输入
第一行输入一个正整数n;
第二行输入n个整数,表示A[i],以空格隔开;
第三行输入一个正整数K;
其中1≤n≤30000,对于任意A[i]有-10000≤A[i]≤10000,2≤K≤10000
输出
输出一个数,表示子序列的数目
输入样例
6
4 5 0 -2 -3 1
5
输出样例
7

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e4+10;
int a[N],sum[N],vis[N];
int main(){
    int n,k;
    cin>>n;
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    cin>>k;
    int ans=0;
    vis[0]++;
    for(int i=1;i<=n;i++){
        sum[i]=(sum[i-1]+a[i]+k*10000)%k;
        ans+=vis[sum[i]];
        vis[sum[i]]++;
    }
    cout<<ans<<endl;
}