题目传送门

大致题意:

输入整数n(1<=n<=100000),再输入由n个0或1组成的字符串,求该字符串中满足1和0个数相等的最长子串、子序列。

sample input:

8
01001001

sample output:

4 6

题解:

补充一下子串和子序列的区别:字串必须连续,子序列不必连续。

求01个数相等的最长子序列长度:min(0的个数,1的个数)。

下面说求01个数相等的最长子串长度:

可以建一个sum数组求前缀和,因为要使0和1个数相等,所以0可以用-1代替,故当sum[r]-sum[l-1]=0时区间[l,r]则为满足01个数相等的子串,此时求出l-1和r的差值即为满足条件的子串长度,不断更新结果求最大长度。

但是到这一步后起初想到的做法是两重循环枚举更新最大差值,这样会超时。

O(n)做法:建一个flag数组记录不同前缀和第一次出现的下标位置(也可用map记录),后面找到相同前缀和时则更新两者位置的差值,这样扫一遍就可以了。(注意:当前缀和sum[r]=0时,r即为满足条件的子串长度)

官方题解如下:

Code:

 /*5ms*/
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);
using namespace std;
const int MAX=1e5+;
char s[MAX];
int n,sum[MAX],flag[*MAX],max1;
int main()
{
IO;
while(!(cin>>n>>s+).eof())
{
memset(flag,-,sizeof(flag));
int ans1=,ans0=;
for(int i=;i<=n;i++){
if(s[i]=='')ans0++,sum[i]=sum[i-]-;
else ans1++,sum[i]=sum[i-]+;
if(flag[MAX+sum[i]]==-)flag[MAX+sum[i]]=i;
else max1=max(i-flag[MAX+sum[i]],max1);
if(sum[i]==)max1=max(max1,i);
}
cout<<max1<<' '<<*min(ans1,ans0)<<endl;
}
return ;
}

或者用STL的map实现,代码如下:

 /*52ms*/
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false);
using namespace std;
map<int,int>m;
int main()
{
IO;char c;int n;
while(!(cin>>n).eof())
{
int ret=,ans1=,sum=;
m.clear();m[]=;
for(int i=;i<=n;++i){
cin>>c;
if(c=='')ans1++,sum++;
else sum--;
if(m.count(sum))ret=max(ret,i-m[sum]);//map.count(Key)返回值为1或者0,1返回存在,0返回不存在
else m[sum]=i;
}
cout<<ret<<' '<<*min(ans1,n-ans1)<<endl;
}
return ;
}

2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)的更多相关文章

  1. 2019牛客多校训练第三场H.Magic Line(思维)

    题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...

  2. 2019牛客多校训练第四场K.number(思维)

    题目传送门 题意: 输入一个只包含数字的字符串,求出是300的倍数的子串的个数(不同位置的0.00.000等都算,并考虑前导零的情况). sample input: 600 1230003210132 ...

  3. 2019牛客多校第三场B Crazy Binary String 思维

    Crazy Binary String 思维 题意 给出01串,给出定义:一个串里面0和1的个数相同,求 满足定义的最长子序列和子串 分析 子序列好求,就是0 1个数,字串需要思考一下.实在没有思路可 ...

  4. 2019暑假牛客多校训练-第八场-C-CDMA(递归、水题)

    观察前3组可以推出递归规律,生成下一个类型时,每行copy自身与自身相反. 题目描述 Gromah and LZR have entered the third level. There is a b ...

  5. 2019 牛客多校第三场 B Crazy Binary String

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题目大意   给定一个长度为 N 的 01 字符串,输出最长子串和子序列的长度,满足其中 0 和 1 的个 ...

  6. 牛客多校训练第八场G.Gemstones(栈模拟)

    题目传送门 题意: 输入一段字符串,字符串中连续的三个相同的字符可以消去,消去后剩下的左右两段字符串拼接,求最多可消去次数. 输入:ATCCCTTG   输出:2 ATCCCTTG(消去CCC)——& ...

  7. 2019牛客多校(第十场)F Popping Balloons —— 线段树+枚举

    https://ac.nowcoder.com/acm/contest/890/F 题意:二维平面中有n个气球,你可以横着社三法子弹,竖着射三发子弹,且横着子弹的关系是y,y+r,y+2*r,竖着是x ...

  8. 牛客多校训练第八场C.CDMA(思维+构造)

    题目传送门 题意: 输入整数m( m∈2k ∣ k=1,2,⋯,10),构造一个由1和-1组成的m×m矩阵,要求对于任意两个不同的行的内积为0. 题解: Code: #include<bits/ ...

  9. 左闭右开线段树 2019牛客多校(第七场)E_Find the median(点代表区间

    目录 题意 一种解析 AC_Code @(2019第七场牛客 E_Find the median 左闭右开线段树) 题意 链接:here 我理解的题意就是:初始序列为空,有\(n(400000)\)次 ...

随机推荐

  1. 源码阅读 - java.util.concurrent (一)

    java.util.concurrent这个包大致可以分为五个部分: Aomic数据类型 这部分都被放在java.util.concurrent.atomic这个包里面,实现了原子化操作的数据类型,包 ...

  2. CSU 1326:The contest(并查集+分组背包)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1326 题意:…… 思路:并查集建图处理出边,然后分组背包. 之前不会分组背包,比赛的时候也推不出来 ...

  3. SpringMVC——MVC

    一.了解MVC mvc这种设计模式,分为三个基本部分:模型(Model).视图(View)和控制器(Controller),不光运用于Web领域,而且也能用于非Web领域:可以特指一种表现层设计模式, ...

  4. 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能

    上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...

  5. Java多线程(六):wait(),notify()和notifyAll()

    wait(),notify()和notifyAll()介绍 1.wait() 使当前线程等待,直到另一个线程调用notify(),notifyAll()或者中断,当前线程调用wait()之前必须持有锁 ...

  6. 【dfs基础讲解及例题】

    定义 DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种. 接下来因为懒得去找大段大段深奥的材料 所以就是一些个人的理解. 所谓深搜,是相对于广搜(只是第一篇)来说的.深 ...

  7. Jenkins+Sonar搭建持续集成和代码质量检查环境

    Jenkins+Sonar搭建 一.相关环境及下载地址 系统:Ubuntu JDK:1.8 MySQL:5.7 软件包: jenkins_2.121.3_all.deb sonarqube-7.3.z ...

  8. [springboot] 搭建项目及单元测试

    本文纯属记录自己学习的过程以及相关使用操作,使用工具Idea2018. 1.创建项目: -- 目录结构 2.配置文件   3.pom文件 4.创建测试类并启动项目 package com.zr.dem ...

  9. hadoop之安装hadoop

    官网 http://hadoop.apache.org/ 下载页:https://hadoop.apache.org/releases.html 上传安装包到Linux 解压并进入到目录下 [root ...

  10. 关于python3与python2同时存在情况下导入pyqt失败解决记录

    最近感觉tkinter功能还是比较不适合新手做出高大上的界面,故开始使用pyqt,通过pip安装好了之后,利用qt设计师设计好界面之后,cmd运行之,报错提示没有找到pyqt5模块,IDE运行能正常加 ...