前缀和O(n)搞定
把0看成-1,当某个i的前缀和prefixSum[i]和某个j的prefixSum[j]相等,则(i,j]这一段0和1个数相等。记录这个前缀和最早出现的位置,后边再出现相同前缀和时,更新答案就好
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+10;
int MAX = 1e6;
int index[MAXN*2];
int prefixSum[MAXN];
int len = 1;
int main()
{
char ch;
int res = 0;
memset(index,0x3f,sizeof(index));
index[0+MAX] = 0;
while((ch = getchar()) && ch != '\n')
{
if(ch == '1') prefixSum[len] = prefixSum[len-1] + 1;
else prefixSum[len] = prefixSum[len-1] - 1;
if(len < index[prefixSum[len]+MAX])
index[prefixSum[len]+MAX] = len;
else
res = max(res,len-index[prefixSum[len]+MAX]);
len++;
}
cout << res << endl;
return 0;
}