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的个数相等。相关推荐

  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]. 不能使用除 ...

  2. 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转

    有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度. 给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转 ...

  3. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代

    请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...

  4. 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

    题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 ...

  5. MySQL设计一个图书馆数据库_请设计一个图书馆数据库

    匿名用户 1级 2014-05-05 回答 原文出处]现代图书情报技术 京 200206 4-6 G9 图书馆学.信息科学.资料工作 200301 基于UML的高校图书馆管理系统 The Applic ...

  6. 3000块你请不到一个农民工,只能请到一个大学生

    白领空心化是高等教育膨胀和僵化的结果,而蓝领崛起是市场对教育资源错配的纠正.教育界必将有所反应.重视基础教育和职业培训,将是未来的方向. 对此,高等教育学府反应太慢,以培训机构和付费知识为代表的民间教 ...

  7. Excel如何批量将表中的0替换成空值?同时不能影响正常数字中包含的0

    按Ctrl+F然后在弹出对话bai框选择"替换",在"查找"输入du 0,然后勾选zhi "匹配整个单元格内容"(Match entire ...

  8. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

    请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...

  9. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构

    **请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,Fals ...

最新文章

  1. “源代码中禁止显示”概述
  2. java78条注意事项
  3. 【Python】简单而不简约:一份Python小抄奉上
  4. 如何查看一个组件的 classid是多少_万一免五(万1免5)是骗人的吗?如何查看自己的交易费率是多少?万一免五最新问题汇总!...
  5. linux创建定时任务命令,linux设置定时任务的方法步骤
  6. 计算机基础知识 音频,计算机基础知识(总结+试题).pdf
  7. 第四章 ASP.NET MVC HTML.ActionLink输出超链接的具体用法
  8. 有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
  9. MATLAB 与Modelsim之间对测试系统的联合仿真
  10. 数据样本过大 数据维度过大:用户名做一个聚类2.可以将时间分段,达到降维的效果
  11. 学校后勤物资管理系统(数据库课程设计)
  12. Android 开机logo支持的格式
  13. python怎么测试opencv安装是否成功_测试opencv安装成功
  14. ps—图层、(移动工具中)对齐
  15. 金融分析与风险管理——期权的隐含波动率
  16. 用AlexNet训练MSTAR数据集
  17. 如何下载720云上的全景图片?
  18. 高中关于人工智能方面的课题_人工智能课题及其认识意义.doc
  19. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录
  20. Matlab散点图进阶——矩阵气泡图

热门文章

  1. [Web 开发] URL 的最大长度
  2. 系统的本地策略不允许您采用交互式登录
  3. android标题白色_Android设置布局背景为白色的三种方法
  4. 分布式通信协议RPC协议简介
  5. Golang Java 实现 【将有序数组装换为二叉搜索树】
  6. 配置nfs环境的一些命令
  7. 004redis与python的交互
  8. mysql拷贝文件安装_Mysql5.7.18的安装与主从复制图文详解
  9. ad服务器修改域名,ad服务器改域名
  10. 奇瑞a3中控按键图解_实拍奇瑞全新瑞虎e 十万元级纯电SUV新选择