題目描述
給定一個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;
}