题目: 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。

一个字符串,只包含01,长度不超过1000000。 输出 一行一个整数,最长的0与1的个数相等的子串的长度。 输入样例 1011 输出样例 2

解法: 用vector记录前缀和,然后遍历求最长长度,注意处理前缀和为负数。 代码:

#include<vector>
using namespace std;
char a[1000010];
vector<int> p[2000010];
int main()
{
    scanf("%s",a + 1);
    int l = strlen(a + 1);
    int sum = 0;
    int Max = -999999999;
    int Min = 999999999;
    p[1000000].push_back(0);
    for(int i = 1; i <= l; 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);
}

ps:懒惰又差点战胜了我 加油