把0变成-1,然后求前缀和,如果出现前缀和一样的,
说明这俩个前缀和之间的-1和1的个数及01的个数相同
然后每次比较最大值
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
int main(){
static char s[1000000+10];
scanf("%s",s);
static int a[1000000+10]={0};
int len=strlen(s);
for(int i=0;i<len;i++){
if(s[i]=='1') a[i+1]=1;
else a[i+1]=-1;
}
int sum=0;
int maxn=0;
map<int,int> m;
for(int i=1;i<=len;i++){
sum+=a[i];
if(sum==0){
maxn=max(maxn,i);
}
else{
if(m[sum]==0){
m[sum]=i;
}
else{
maxn=max(maxn,i-m[sum]);
}
}
}
cout<<maxn;
return 0;
}