给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393
这题解法很奇妙。也是看了别人的思路才想出来.
首先考虑把0全部变成-1。然后统计一个前缀和,用sum[i]表示.
那么从起点开始的子串是合法的只要sum[i]的值等于0即可.
如果子串起点不为0,那么只要两次出现sum[i],这两个数值之间一定是合法的子串.
例如:
标号: 1 2 3 4 5
数值 0 0 1 1 0
sum -1 -2 -1 0 -1
i==4的时候sum[i]==0,所以1-4之间是一个合法的子串,长度为4
sum[1]==sum[3]==sum[5]== -1,所以 (1,3],(1,5],(3,5]之间都是合法的子串,取最大值也是4.
我是用了map,其实不用这么麻烦,只要用一个变量就可以代替sum数组,并且另外开一个标记数组可以代替map做映射.
1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 #include <map> 5 using namespace std; 6 char s[1000010]; 7 int t[1000010],sum[1000010]; 8 int main() 9 { 10 //freopen("a.txt","r",stdin); 11 scanf("%s",s+1); 12 int l=strlen(s+1); 13 for(int i=1;i<=l;i++) 14 if(s[i]=='0') t[i]=-1; 15 else t[i]=1; 16 //for(int i=0;i<l;i++) printf("%d",t[i]); 17 sum[1]=t[1]; 18 map<int,int>m; 19 m[sum[1]]=1; 20 int maxn=0; 21 for(int i=2;i<=l;i++) 22 { 23 sum[i]=sum[i-1]+t[i]; 24 //printf("%d\n",sum[i]); 25 if(m[sum[i]]!=0) maxn=max(maxn,i-m[sum[i]]); 26 else m[sum[i]]=i; 27 if(sum[i]==0) maxn=max(maxn,i); 28 } 29 printf("%d\n",maxn); 30 return 0; 31 }
转载于:https://www.cnblogs.com/nowandforever/p/4620372.html
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。相关推荐
- 剑指offer:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,..,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]. 不能使用除 ...
- 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转
有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度. 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转 ...
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代
请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...
- 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 ...
- MySQL设计一个图书馆数据库_请设计一个图书馆数据库
匿名用户 1级 2014-05-05 回答 原文出处]现代图书情报技术 京 200206 4-6 G9 图书馆学.信息科学.资料工作 200301 基于UML的高校图书馆管理系统 The Applic ...
- 3000块你请不到一个农民工,只能请到一个大学生
白领空心化是高等教育膨胀和僵化的结果,而蓝领崛起是市场对教育资源错配的纠正.教育界必将有所反应.重视基础教育和职业培训,将是未来的方向. 对此,高等教育学府反应太慢,以培训机构和付费知识为代表的民间教 ...
- Excel如何批量将表中的0替换成空值?同时不能影响正常数字中包含的0
按Ctrl+F然后在弹出对话bai框选择"替换",在"查找"输入du 0,然后勾选zhi "匹配整个单元格内容"(Match entire ...
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构
**请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,Fals ...
最新文章
- “源代码中禁止显示”概述
- java78条注意事项
- 【Python】简单而不简约:一份Python小抄奉上
- 如何查看一个组件的 classid是多少_万一免五(万1免5)是骗人的吗?如何查看自己的交易费率是多少?万一免五最新问题汇总!...
- linux创建定时任务命令,linux设置定时任务的方法步骤
- 计算机基础知识 音频,计算机基础知识(总结+试题).pdf
- 第四章 ASP.NET MVC HTML.ActionLink输出超链接的具体用法
- 有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
- MATLAB 与Modelsim之间对测试系统的联合仿真
- 数据样本过大 数据维度过大:用户名做一个聚类2.可以将时间分段,达到降维的效果
- 学校后勤物资管理系统(数据库课程设计)
- Android 开机logo支持的格式
- python怎么测试opencv安装是否成功_测试opencv安装成功
- ps—图层、(移动工具中)对齐
- 金融分析与风险管理——期权的隐含波动率
- 用AlexNet训练MSTAR数据集
- 如何下载720云上的全景图片?
- 高中关于人工智能方面的课题_人工智能课题及其认识意义.doc
- DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录
- Matlab散点图进阶——矩阵气泡图