51nod 1393 0和1相等串 思路 : map存前缀和

题目:

思路:把‘0‘当成数字-1,‘1‘当成数字1,求前缀和,用map更新当前前缀和最早出现的位置。(用map而不用数组是因为可能会出现负数)

   当前缀和的值之前出现过,比如i = 10时,sum = 0;j = 50时,sum = 0; 更新ans = max(ans,j-i);

代码:

#include <bits\stdc++.h>
using namespace std;

map<int,int> m; //存前缀和最早出现的位置
int a[1000001]; //数字数组
int main(){
    string s;
    cin >> s;

    //将字符串转换成数字数组
    for (int i = 0; s[i]; ++i) {
        if (s[i] == ‘0‘) a[i + 1] = -1;
        else a[i + 1] = 1;
    }

    int ans = 0;  //最大长度
    int sum = 0;  //前缀和
    for (int i = 1; i <= s.length(); ++i) {
        sum += a[i];   //m[i]默认是为0的 (i为任意值)

        if (sum != 0 && m[sum] == 0) {
            m[sum] = i; //之前未出现过相同值
        }
        else {
            ans = max(ans, i - m[sum]); // 之前出现过相同值
        }
    }

    cout << ans << endl;
    return 0;
} 
时间: 2024-10-12 06:16:39

51nod 1393 0和1相等串 思路 : map存前缀和的相关文章

1393 0和1相等串 51nod

1393 0和1相等串 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等. Input 一个字符串,只包含01,长度不超过1000000. Output 一行一个整数,最长的0与1的个数相等的子串的长度. Input示例 1011 Output示例 2 起点和终点的关系整理一下,有时候可以得到一种hash的思路. #include<iostream> #include<

51nod 1393 1393 0和1相等串

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393 当0和1的数量差值为0时,进行记录和ans进行比较,其他的,差值相等时,0和1的数量一定相等.用后面的减前面的情况. #include<bits/stdc++.h> using namespace std; char s[1000005]; int a[1000005],b[1000005]; map<int,int>m; main() { int

51Nod 1433 0和5(9的倍数理论)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1433 思路: 数论中关于9的倍数的理论:若是一个数能被9整除,则各位数之和为9的倍数. 因为这题是90的倍数,所以至少得有一个0. 分别统计0和5的个数,9个5相加的话就是9的倍数,计算出能有几个9个5,剩下的0全排最后就可以了. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstrin

Hibernate5.0 EntityManager转SqlQuery并返回Map结果集

Hibernate5.0 EntityManager转SqlQuery并返回Map结果集 Query query = entityManager.createNativeQuery("select * from message");query.unwrap(org.hibernate.SQLQuery.class) .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List<Map<String, Object

实现vue2.0响应式的基本思路

最近看了vue2.0源码关于响应式的实现,以下博文将通过简单的代码还原vue2.0关于响应式的实现思路. 注意,这里只是实现思路的还原,对于里面各种细节的实现,比如说对象里面数据的操作的监听,以及对象嵌套这些细节本实例都不会涉及到,如果想了解更加细节的实现思路,可以通过阅读源码 observer文件夹以及instance文件夹里面的state文件具体了解. 首先,我们先定义好实现vue对象的结构 class Vue { constructor(options) { this.$options =

51nod——1391 01串(字符串、前缀和)

好像这题是4级题下放2级? 预处理:求每个位置 x 左区间 [ 0 , x ] 中 1 比 0 多的数量和右区间 ( x , n - 1 ] 中 0 比 1 多的数量(少就是负的).相当于求两个前缀和.这样在判断 1 多还是 0 多时判断前缀和与零的大小关系就行了. 更新答案:对于字符串中的每个位置 x 的左侧,要求前缀和小于零.如果小于零,符合要求,长度即下标加一.如果大于零(设为 k ),要从头开始,找到第一个位置,这个位置的左侧 1 也比 0 多 k 个,这样把这个位置之前的串剪掉,就剩下

51nod 1433 0和5(9的倍数的规律)

1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前导0, 2.小K不需要使用所有的牌. Input 每个测试数据输入共2行. 第一行给出一个n,表示n张牌.(1<=n<=1000) 第二行给

51nod 1433 0和5

题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前导0, 2.小K不需要使用所有的牌. Input 每个测试数据输入共2行. 第一行给出一个n,表示n张牌.(1<=n<=1000) 第二行给出n个整数a[0],a[

51Nod 1433 0和5 (数论 &amp;&amp; 被9整除数的特点)

题意 : 小K手中有n(1~1000)张牌, 每张牌上有一个一位数的数, 这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张), 排成一行这样就组成了一个数.使得这个数尽可能大, 而且可以被90整除.注意:① 这个数没有前导0.② 小K不需要使用所有的牌. 分析 : 能被9整除的数, 其各个位数相加之后的和也是9的倍数.那能被90整除的数就相当于能加多了10倍, 即末尾加上了一个0.那只要构造一个前缀有k个5(k是9的倍数), 后缀填充0即可, 这里要注意如果没有0可选是无法构造出来的