CF873B 前缀和+map

Posted allenmi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF873B 前缀和+map相关的知识,希望对你有一定的参考价值。

Balanced Substring

刚讲过差分与前缀和专题,一直以为这两个名词很高大上,其实也就那回事。哈哈。

题源https://codeforces.com/contest/873/problem/B

题意:给你一串01字符串,让你寻找其中最长的平衡字符串长度。

平衡字符串:字符串中 1的个数=0的个数

题解:所谓平衡,那么当遇见0的时候当-1。然后利用前缀和的思想,求出前缀和。
当一个前缀和第二次出现的时候就是出现了平衡字符串。那么我们用map<int,int>来记录前缀和sum和第一次出现的下标即可,之后再遇见sum,计算平衡字符串的长度就ok。

PS:我可不会告诉你我先开始求出了一个前缀和数组s,然后傻乎乎的从开始找那个数,然后从倒着找另一个数。时间复杂度太高了(扯犊子操作啊哈哈)

代码

#include <iostream>
#include <cstdio>
#include <map>
#define maxn 100005
using namespace std;
//@start: 2020-03-26 20:44:09
//source:https://codeforces.com/contest/873/problem/B
//前缀和

map<int,int> mp;

int main()
{
    int n,sum=0,ans=0;
    string s;
    cin>>n>>s;
    mp[0]=0;//此地方是个坑点
    for(int i=0;i<n;i++)
    {
        if(s[i]==‘1‘)sum++;
        else sum--;
        if(mp.count(sum))
            ans=max(ans,i+1-mp[sum]);
        else 
            mp[sum]=i+1;
    }
    cout<<ans;
    return 0;
}

以上是关于CF873B 前缀和+map的主要内容,如果未能解决你的问题,请参考以下文章

CF873B Balanced Substring (前缀和)

Codeforces 873B - Balanced Substring(思维)

异或前缀和,组合数学——cf1054D

CF1352E Special Permutation(桶排序+前缀和)

CF978C Letters前缀和+二分查找/几房几号

[贪心] aw3774. 亮灯时长(思维+后缀和+代码细节+CF1000B)