给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
收起
输入
一个字符串,只包含01,长度不超过1000000。
输出
一行一个整数,最长的0与1的个数相等的子串的长度。
输入样例
1011
输出样例
2
我发现脑洞一定要大,越大越好,不然有些办法你想不出来,
如果0和1的个数相等,我们要做的事情就是找到最长的区间[i+1~j]:使得s[i]==s[j];
那么我们设定一个数组a[i]表示数值i出现的最左端的位子,但是这么设定显然不行,因为可能有负数的情况,那么对应设定一个mid(这也就是为什么是1003000的原因),表示其为0,那么-1出现的最左端的位子就是a[mid-1],我们在过程中维护最大值即可,注意:10/01/0000001这样类似的情况。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
int a[2006000];
char s[2006000];
int main()
{
scanf("%s",s+1);
memset(a,-1,sizeof(a));
int mid=1003000,ans=0,num1=0,num0=0;
int l=strlen(s+1);
a[mid]=0;
for(int i=1; i<=l; i++)
{
if(s[i]=='1')
num1++;
else num0++;
int sum=num0-num1;
if(a[mid+sum]==-1)
{
a[mid+sum]=i;
}
ans=max(ans,i-a[mid+sum]);
}
printf("%d\n",ans);
return 0;
}