小b有一个01序列,她想找到一个最长的区间使得这个区间的01能两两配对,即0的个数和1的个数相等。求最长区间的长度。
输入
第一行一个正整数n,表示数组长度,其中0<n≤50000;
第二行n个0或1,以空格隔开。
输出
输出一个数,表示最长区间的长度
输入样例
3
0 1 0
输出样例
2
这题差不多
#include<bits/stdc++.h>
using namespace std;
int s[50010];
int v[100020];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
int maxn=0,sum=50000;
memset(v,0,sizeof(v));
for(int i=0;i<n;i++)
{
if(s[i]==0) sum--;
else sum++;
if(sum==50000) maxn=i+1;//合为0,肯定最大
else if(!v[sum]) v[sum]=i+1;//记录第一个数出现的下标
else maxn=max(maxn,i+1-v[sum]);//以存在这个数,减去保存的下标即是长度
}
cout<<maxn;
return 0;
}