最长连续01字符串

个人心得:思维比较混乱,已经慢慢找到了一特点就是这子字符串满足1,0数目相等,所将0用-1代替,则此时

sum【l-1】=sum【r】,然后想到这里还是要用俩重循环,还会超时,后面看了题解,他是用min,max数组记录相等

sum的位置,只要存在相等的sum然后循环一次取最大的差值就好了,真的是感觉自己做题做得太少了,暑假还是

不怎么上心,希望以后能改改吧。

给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。

Input

一个字符串,只包含01,长度不超过1000000。

Output

一行一个整数,最长的0与1的个数相等的子串的长度。

Sample Input

1011

Sample Output

2
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int p=1000000;
 7 char s[1000005];
 8 int sum[1000005];
 9 int mina[5000005],maxa[5000005];
10 int main(){
11    scanf("%s",s+1);
12    int le=strlen(s+1);
13    memset(mina,-1,sizeof(mina));
14    memset(maxa,-1,sizeof(maxa));
15    if(s[1]=='1') sum[1]=1;
16    else sum[1]=-1;
17    for(int i=2;i<=le;i++)
18       if(s[i]=='1') sum[i]=sum[i-1]+1;
19    else sum[i]=sum[i-1]-1;
20    for(int i=0;i<=le;i++)
21    {
22        int x=sum[i];
23        if(mina[x+p]==-1) mina[x+p]=i;
24    }
25     for(int i=le;i>=0;i--)
26     {
27         int x=sum[i];
28        if(maxa[x+p]==-1) maxa[x+p]=i;
29     }
30     int ans=0;
31     for(int i=0;i<=le+p;i++)
32     if(mina[i]!=-1)
33       ans=max(ans,maxa[i]-mina[i]);
34         cout<<ans<<endl;
35   return 0;
36 }

 



posted @ 2017-08-22 09:53  余生漫漫浪  阅读(2100)  评论(0编辑  收藏  举报