题目:

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

输入

第一行一个正整数n,表示数组长度,其中0<n≤50000; 第二行n个0或1,以空格隔开。

输出

输出一个数,表示最长区间的长度

输入样例

3
0 1 0

输出样例

2

解法:

将0当做-1处理,处理前缀和,记录前缀和相同的位置,计算出前缀和相同位置的最长距离。

代码:

#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;
int a[1000010];
vector<int> p[2000010];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1; i <=n; i++)
        scanf("%d", &a[i]);
    int sum = 0;
    int Max = -999999999;
    int Min = 999999999;
    p[1000000].push_back(0);
    for(int i = 1; i <= n; i++)
    {
        if(a[i] == 0)
            sum++;
        else
            sum--;
        Max = max(sum, Max);
        Min = min(sum, Min);
        p[sum + 1000000].push_back(i); 
    }
    int ans = 0;
    
    //printf("%d %d\n", Min, Max);
    for(int i = Min + 1000000; i <= Max + 1000000; i++)
    {
        ans = max(p[i][p[i].size() - 1]-p[i][0], ans);
    }
    printf("%d\n", ans);
}