zoukankan      html  css  js  c++  java
  • CodeForces

    Balanced Substring

    题目大意

    给定一个字符串, 字符串中只含有 0 和 1, 求一个区间 [l, r] 内, 0 和 1 数量相等的最大子串.

    思路

    这道题的字符串最大长度为 100000, 若使用 O(n) 的算法肯定会超时, 所以需要使用 前缀和 进行求值.

    对于prefixSum(初始化为100100, 防止负数导致下标越界) 将 0 处理为 -1, 1 处理为 +1 操作;

    一个 last 数组保存 一个前缀和 的 第一次出现的位置. 不断更新 ans数组, 需要注意的是 last[0] = 0; 因为当数组长度为 0 时, 前缀和为 0, 这样可以防止答案为整个数组长度时.

    代码

    #include <cstdio>
    #include <cstring>
    #define MAXN 200200
    #define MOVL 100100
    using namespace std;
    int last[MAXN];
    int ans[MAXN];
    int max(int a, int b){
        return a > b ? a : b;
    }
    int main(){
        int nNum;
        scanf("%d
    ", &nNum);
        char c;
        int fi = 0, prefixSum = MOVL;
        memset(last, -1, sizeof(last));
        last[0 + MOVL] = 0;
        for(int i = 1; i <= nNum; i++){
            int val = getchar() - '0';
            if(val == 0) val = -1;
            prefixSum += val;
    
            if(last[prefixSum ] == -1)
                last[prefixSum ] = i;
            else
                ans[prefixSum] = i - last[prefixSum];
            fi = max(fi, ans[prefixSum]);
        }
        printf("%d", fi);
        return 0;
    }
    
    
  • 相关阅读:
    删除ASP.net临时文件的操作步骤
    设置字段必录,但是直接点提交没有检查必录
    JavaWeb-Session
    Java集合类详解 转
    使用COS组件实现文件上传 转
    Java泛型详解 转
    java接口与工厂
    Vector和ArrayList的比较
    ArrayList
    关闭myeclipse自动校验特别是对js文件的校验
  • 原文地址:https://www.cnblogs.com/1pha/p/7788542.html
Copyright © 2011-2022 走看看