2019牛客多校训练第三场B.Crazy Binary String(思维+前缀和)
大致题意:
输入整数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(思维+前缀和)的更多相关文章
- 2019牛客多校训练第三场H.Magic Line(思维)
题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...
- 2019牛客多校训练第四场K.number(思维)
题目传送门 题意: 输入一个只包含数字的字符串,求出是300的倍数的子串的个数(不同位置的0.00.000等都算,并考虑前导零的情况). sample input: 600 1230003210132 ...
- 2019牛客多校第三场B Crazy Binary String 思维
Crazy Binary String 思维 题意 给出01串,给出定义:一个串里面0和1的个数相同,求 满足定义的最长子序列和子串 分析 子序列好求,就是0 1个数,字串需要思考一下.实在没有思路可 ...
- 2019暑假牛客多校训练-第八场-C-CDMA(递归、水题)
观察前3组可以推出递归规律,生成下一个类型时,每行copy自身与自身相反. 题目描述 Gromah and LZR have entered the third level. There is a b ...
- 2019 牛客多校第三场 B Crazy Binary String
题目链接:https://ac.nowcoder.com/acm/contest/883/B 题目大意 给定一个长度为 N 的 01 字符串,输出最长子串和子序列的长度,满足其中 0 和 1 的个 ...
- 牛客多校训练第八场G.Gemstones(栈模拟)
题目传送门 题意: 输入一段字符串,字符串中连续的三个相同的字符可以消去,消去后剩下的左右两段字符串拼接,求最多可消去次数. 输入:ATCCCTTG 输出:2 ATCCCTTG(消去CCC)——& ...
- 2019牛客多校(第十场)F Popping Balloons —— 线段树+枚举
https://ac.nowcoder.com/acm/contest/890/F 题意:二维平面中有n个气球,你可以横着社三法子弹,竖着射三发子弹,且横着子弹的关系是y,y+r,y+2*r,竖着是x ...
- 牛客多校训练第八场C.CDMA(思维+构造)
题目传送门 题意: 输入整数m( m∈2k ∣ k=1,2,⋯,10),构造一个由1和-1组成的m×m矩阵,要求对于任意两个不同的行的内积为0. 题解: Code: #include<bits/ ...
- 左闭右开线段树 2019牛客多校(第七场)E_Find the median(点代表区间
目录 题意 一种解析 AC_Code @(2019第七场牛客 E_Find the median 左闭右开线段树) 题意 链接:here 我理解的题意就是:初始序列为空,有\(n(400000)\)次 ...
随机推荐
- Codeforces Gym101503E:XOR-omania(构造+思维)
题目链接 题意 给出m个数b,这些数是由n个数a两两异或组成的,问初始的那n个数分别是多少. 思路 存在多组解的情况...原来是个构造题. 考虑这样一种情况:b1 = a1 ^ a2,b2 = a2 ...
- scrapy基础知识之 RedisCrawlSpider:
这个RedisCrawlSpider类爬虫继承了RedisCrawlSpider,能够支持分布式的抓取.因为采用的是crawlSpider,所以需要遵守Rule规则,以及callback不能写pars ...
- PLC_SIM 出现I/O访问错误-技术论坛-工业支持中心-西门子中国
PLC_SIM 作为SIEMENS S7-300/400 系列PLC 的仿真软件,在使用时需要有些注意事项,毕竟任何的仿真软件和真正的设备还是有一定差异的,由此而产生的误会经常会令很多客户摸不着头脑, ...
- python无网安装psycopg2
1. 问题描述 python项目要获取greenplum数据库数据,gp底层是postgresql,需要使用python的第三方工具包psycopg2操作数据库,但是问题是服务器上没有网络,无法在 ...
- Greenplum客户端访问控制
1. 问题描述 Greenplum默认是对客户端不开放的,即客户端要访问Greenplum数据库,需要首先开通权限. 2. 解决方案: 2.1.安装greenplum-cc-web控制台. Gp的 ...
- 基于C#的机器学习--微基准测试和激活功能
本章我们将学习以下内容: l 什么是微基准测试 l 如何将它应用到代码中 l 什么是激活函数 l 如何绘制和基准测试激活函数 每个开发人员都需要有一个好的基准测试工具.质量基准无处不在;你们每 ...
- Socket编程(C语言实现):socket()函数英文翻译
最近开始研究使用Socket API来网络编程,想着把自己的感想.感悟写下来.我发现在编程之外还有不少概念性的东西要学习.我觉得应该有以下几点吧: 1.得了解下计算机网络的基本概念,如OSI的7层模型 ...
- 云开发新能力,支持 HTTP 调用 API
今天来上班打开电脑,总感觉微信开发文档哪里有点不太一样,研究了半天原来是云开发又多了神级功能--HTTP API! HTTP API是什么?简单来说就是通过云开发HTTP API,可以不需要通过微信小 ...
- MMM 状压dp学习记
状压dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- CSingleLock
CSingleLock通常和CCriticalSection配合使用.总结这种用法