码迷,mamicode.com
首页 > 其他好文 > 详细

【CF】873B 前缀和+map

时间:2020-03-27 13:09:26      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:就是   开始   cin   sum   地方   记录   下标   ++   利用   

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;
}

【CF】873B 前缀和+map

标签:就是   开始   cin   sum   地方   记录   下标   ++   利用   

原文地址:https://www.cnblogs.com/AllenMi/p/12580418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!