一个字符串,只包含01,长度不超过1000000。
一行一个整数,最长的0与1的个数相等的子串的长度。
1011
2
准备一个sum,如果碰到0则-1,碰到1则+1.
对于每一个sum,记录最早碰到时的坐标。 以后如果在碰到了,那么这两个相同的sum之间的值就是符合条件的。这样可以保证每次查询都是最大的,因为只和第一次出现的值作比较,最长。
还有一点,如果碰到sum=0了,说明从开始到当前点就是
不过需要注意一点,如果一开始很多0,那么sum是负的,我们无法存储,所以我们所有的sum都加10000000. 这样保证哪怕所有的字符全为0,也可以储存。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<algorithm>
#include<stack>
using namespace std;
string s;
int vis[11110000];
int main()
{
cin>>s;
memset(vis,-1,sizeof(vis));
int sum=0;
int maxx=0;
vis[1000000]=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='0')
{
sum=sum-1;
}
if(s[i]=='1')
{
sum=sum+1;
}
if(sum==0)
{
maxx=max(maxx,i+1);
}
else
{
if(vis[sum+1000000]==-1)
{
vis[sum+1000000]=i;
}
else
{
maxx=max(maxx,i-vis[sum+1000000]);
}
}
}
cout<<maxx<<endl;
}