小b有一个01序列,她想找到一个最长的区间使得这个区间的01能两两配对,即0的个数和1的个数相等。求最长区间的长度。
收起
输入
第一行一个正整数n,表示数组长度,其中0<n≤50000; 第二行n个0或1,以空格隔开。
输出
输出一个数,表示最长区间的长度
输入样例
3 0 1 0
输出样例
2
先把0转化成-1,然后就可以转化出求最长连续0的个数。
先预处理出前缀和,枚举前缀和看是否为0这样就可以了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int t ;
ll n;
cin>>n;
int a[50006];
int s[60006];
memset(s,0,sizeof(s));
for(int i=1; i<=n; i++)
{
cin>>a[i];
a[i]=a[i]==1?1:-1;
//cout<<a[i]<<endl;
s[i]=s[i-1]+a[i];//预处理出前缀和
}
//cout<<"Dddd"<<endl;
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(s[j]-s[i-1]==0)
ans=max(ans,j-(i-1));
}
}
cout<<ans<<endl;
}