zoukankan      html  css  js  c++  java
  • 最长连续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 }


  • 相关阅读:
    FocusScope学习三: 对FocusScope 的探究与总结
    FocusScope学习二: 很好的理解FocusScope的工作原理
    不同XML之间节点的拷贝
    计算几何DotVector
    计算几何Graham法凸包
    计算几何UVa10652
    线性筛三合一,强大O(n)
    计算几何AngRadVector
    线性筛euler,强大O(n)
    矩阵bzoj1898
  • 原文地址:https://www.cnblogs.com/blvt/p/7410100.html
Copyright © 2011-2022 走看看