最長01串 SDUT 3308

題目描述

給定一個0-1串,請找到一個儘可能長的連續子串,其中包含的01的個數相等。
組數很多,注意常數優化。。。

輸入

 一個字符串,只包含01,長度不超過1000000

輸出

 一行一個整數,最長的01的個數相等的子串的長度。

示例輸入

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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章