CF873B Balanced Substring (前缀和)

CF873B Balanced Substring (前缀和)

蛮有意思的一道题,不过还是.....................因为CF评测坏了,没有试过是否可过.
显然求\(\sum[i][0] - \sum[l][0] = \sum[i][1] - \sum[l][1]\)
\(\sum[i][0] - \sum[l][1] = \sum[i][0] - \sum[l][0]\)
然后hash一下DP即可.

#include <iostream>
#include <cstdio>
using namespace std;
#define rep(i,x,p) for(int i = x;i <= p;++ i)
const int maxN = 100000 + 7;
/*
设状态sum[i]
sum[i][0]表示前i位0数的个数
sum[i][1]表示前i位1数的个数
*/
int f[maxN][2]; // f[i][0]表示 sum[i][0] - sum[i][1]最远位置.
                // f[i][1]表示 sum[i][1] - sum[i][0]最远位置.
int a[maxN];
char c[maxN];
int sum[maxN][2];

inline int max(int a,int b) {return a > b ? a : b;}
inline int min(int a,int b) {return a > b ? b : a;}

inline int read() {
    int x = 0,f = 1;char c = getchar();
    while(c < '0' || c > '9') {if(c == '-')f = -1;c = getchar();}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
    return x * f;
}

int main() {
    int n = 0,ans = 0;
    n = read();
    rep(i,1,n) scanf("%1d",&a[i]);
    rep(i,1,n) {
        sum[i][0] = sum[i - 1][0];
        sum[i][1] = sum[i - 1][1];
        a[i] == 0 ? sum[i][0] ++ : sum[i][1] ++;
        if(sum[i][0] > sum[i][1]) {
            int tmp = sum[i][0] - sum[i][1];
            if(f[tmp][0]) ans = max(ans,i - f[tmp][0]);
            else f[tmp][0] = i;
        }
        else {
            int tmp = sum[i][1] - sum[i][0];
            if(f[tmp][1]) ans = max(ans,i - f[tmp][1]);
            else f[tmp][1] = i;
        }
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/tpgzy/p/9800650.html

时间: 2024-10-31 02:10:11

CF873B Balanced Substring (前缀和)的相关文章

Codeforces 873 B. Balanced Substring(前缀和 思维)

题目链接: Balanced Substring 题意: 求一个只有1和0的字符串中1与0个数相同的子串的最大长度. 题解: 我的解法是设1的权值是1,设0的权值是-1,求整个字符串的前缀和并记录每个前缀和出现的最后位置.因为两个相同的前缀和之间的子串一定符合条件,最后只用遍历一次,将每个前缀与和这个前缀值相同的位置之间的长度求出来就是符合条件的子串长度.但是这里一定要注意!在整个子串未开始遍历的时候这个子串的前缀和也是0.我就是在这个地方错了,这里给出错地方的数据. 1 #include<bi

Balanced Substring

You are given a string s consisting only of characters 0 and 1. A substring [l, r] of s is a string slsl + 1sl + 2... sr, and its length equals to r - l + 1. A substring is called balanced if the number of zeroes (0) equals to the number of ones in t

CodeForces - 873B Balanced Substring(思维)

inputstandard input outputstandard output You are given a string s consisting only of characters 0 and 1. A substring [l,?r] of s is a string slsl?+?1sl?+?2- sr, and its length equals to r?-?l?+?1. A substring is called balanced if the number of zero

前缀和,二维前缀和!

前缀和 定义 用空间换取效率,做一个预处理,然后可以\(O(1)\)的查询某个区间的值的和. 实现 设\(s_i\)为第\(i\)个数\(a_i\)的前缀和,则\(s_i=s_i-1+a_i\) 当要查找区间的和时只要把对应的起点终点的元素相减即可. 例题 Educational Codeforces Round 30B Balanced Substring 翻译 给你一个长度至多为\(100000\)的\(01\)串,其中含有相同\(0\),\(1\)个数的子串被称为"平衡串",问你

【CF】873B 前缀和+map

Balanced Substring 刚讲过差分与前缀和专题,一直以为这两个名词很高大上,其实也就那回事.哈哈. 题源:https://codeforces.com/contest/873/problem/B 题意:给你一串01字符串,让你寻找其中最长的平衡字符串长度. 平衡字符串:字符串中 1的个数=0的个数 题解:所谓平衡,那么当遇见0的时候当-1.然后利用前缀和的思想,求出前缀和. 当一个前缀和第二次出现的时候就是出现了平衡字符串.那么我们用map<int,int>来记录前缀和sum和第

BZOJ 1637: [Usaco2007 Mar]Balanced Lineup( sort + 前缀和 )

将 0 变为 -1 , 则只需找区间和为 0 , 即前缀和相同的最长区间 , 记录一下每个前缀和出现的最早和最晚的位置 , 比较一下就 OK 了 ------------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostr

CF 1196D2 RGB Substring (hard version) --- 前缀和 + 思维

简单的情况不用前缀和,直接暴力就好,数据范围大的D2,就用前缀和数组存不满足三种情况的数,最后减一下取小就可以. 1 #include<bits/stdc++.h> 2 #define mem(a) memset(a,0,sizeof(a)) 3 #define ll long long 4 #define ld long double 5 #define ull unsigned long long 6 #define mp make_pair 7 #define pb push_back

【差分+前缀和】BZOJ1637: [Usaco2007 Mar]Balanced Lineup

Description Farmer John 决定给他的奶牛们照一张合影,他让 N (1 ≤ N ≤ 50,000) 头奶牛站成一条直线,每头牛都有它的坐标(范围: 0..1,000,000,000)和种族(0或1). 一直以来 Farmer John 总是喜欢做一些非凡的事,当然这次照相也不例外.他只给一部分牛照相,并且这一组牛的阵容必须是“平衡的”.平衡的阵容,指的是在一组牛中,种族0和种族1的牛的数量相等. 请算出最广阔的区间,使这个区间内的牛阵容平衡.区间的大小为区间内最右边的牛的坐标

HDU 1403 Longest Common Substring(最长公共前缀)

http://acm.hdu.edu.cn/showproblem.php?pid=1403 题意:给出两个字符串,求最长公共子串的长度. 思路: 刚开始学后缀数组,确实感觉很难,但是这东西很强大,所以必须要学会它,推荐罗穗骞大牛的论文. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #i