题目描述
给定一个0-1串,请找到一个尽可能长的连续子串,其中包含的0与1的个数相等。
组数很多,注意常数优化。。。
输入
一个字符串,只包含
01
,长度不超过
1000000
输出
一行一个整数,最长的
0
与
1
的个数相等的子串的长度。
示例输入
1011 1111 1010
示例输出
2 0 4
提示
来源
scf0920
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char str[2002000];
int dp[2002000];
int main()
{
while(cin>>str)
{
memset(dp,-1,sizeof(dp));//初始化为-1
int len=strlen(str);
int sum=0,mm=0;
for(int i=0; i<len; i++)
{
if(str[i]=='1')
sum++;
else if(str[i]=='0')
sum--;
if(sum==0)//判断的是从头开始的最长01字串的长度
{
mm=max(i+1,mm);
continue;
}
if(dp[sum+1000000]==-1)
{
dp[sum+1000000]=i;//更新的是每个新出现的01和的值
}
else
mm=max(mm,i-dp[sum+1000000]);//更新最长的01子串的长度
}
cout<<mm<<endl;
}
return 0;
}