【CF】873B Balanced Substring(前缀和+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;
}
posted @ 2020-03-27 11:57  熊子q  阅读(150)  评论(0编辑  收藏  举报