zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 30 B

    Balanced Substring

    题意:给一个01串,找出一个连续最长的子串要求0和1的个数相同,求最长长度

    思路:0当作-1, 1当作1,求前缀和,前缀和相同的2个区间,重叠的区间的和为0,即0和1的个数相同

    AC代码:

    #include "iostream"
    #include "iomanip"
    #include "string.h"
    #include "stack"
    #include "queue"
    #include "string"
    #include "vector"
    #include "set"
    #include "map"
    #include "algorithm"
    #include "stdio.h"
    #include "math.h"
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
    #define mem(a,x) memset(a,x,sizeof(a))
    #define step(x) fixed<< setprecision(x)<<
    #define mp(x,y) make_pair(x,y)
    #define pb(x) push_back(x)
    #define ll long long
    #define endl ("
    ")
    #define ft first
    #define sd second
    #define lrt (rt<<1)
    #define rrt (rt<<1|1)
    using namespace std;
    const ll mod=1e9+7;
    const ll INF = 1e18+1LL;
    const int inf = 1e9+1e8;
    const double PI=acos(-1.0);
    const int N=1e5+100;x
    
    int n,ans,a[N],sum[N];
    map<int,int> f;
    char s[N];
    
    int main(){
        ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
        cin>>n>>s;
        for(int i=0; i<n; ++i){
            if(s[i]=='0') a[i+1]=-1;
            else a[i+1]=1;
        }
        f[0]=0;
        for(int i=1; i<=n; ++i){
            sum[i]=sum[i-1]+a[i];
            if(sum[i]==0) ans=max(ans, i);
            if(f[sum[i]]==0) f[sum[i]]=i;
            else{
                ans=max(ans, i-f[sum[i]]);
            }
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    1017.陶陶装苹果
    1084.爬楼梯加强版
    1056.A ^ B Problem 快速幂算法。
    1074.我们喜欢递归的斐波那契数列
    1073.我们喜欢递归的阶乘
    1046 没过
    python 基本常用数据类型
    yii2.0 数据库查询操作
    python 随便笔记
    搭建自己的koa+mysql后台模板
  • 原文地址:https://www.cnblogs.com/max88888888/p/7666352.html
Copyright © 2011-2022 走看看