首页 > 其他分享 >游游的好串(携程24秋招研发岗第一批)

游游的好串(携程24秋招研发岗第一批)

时间:2024-04-17 09:55:52浏览次数:29  
标签:24 子串 01 窗口 游游 例子 static 秋招

题面

游游的好串
游游有一个只包含'0'和'1'的字符串,他想知道这个字符串有多少个好子串?

一个字符串如果是"好串",那么该字符串的所有前缀,'0'的数量严格大于'1'的数量。

输入

输入一个只包含'0'和'1'的字符串,长度不超过100000。

输出

输出一个整数,代表答案。

示例

输入例子:

100

输出例子:

3

例子说明:
子区间 [2, 2], [2, 3], [3, 3] 组成的子串都是一个好串。

输入例子:

10010

输出例子:

6

例子说明:
子区间 [2, 2], [3, 3], [2, 3], [2, 4], [2, 5], [5, 5] 组成的子串是一个好串。

核心思想

滑动窗口
首先要明确的一点时窗口滑动的过程本身就是前缀
那么窗口两端 l,r 表示 从 l 开始,以 r 结尾的所有子串满足要求的有多少个
这一步操作就是选择了子串 [l,r] [l+1,r]....[r,r]
以 10010 为例

当窗口来到 l = 2, r = 4 时(下标从1开始)窗口串为 001
我们执行 res += (r - l + 1); 这一计算的意义是什么?
我们认为 001, 01, 1 这样的字串都满足要求 但事实上 01, 1 是需要剔除的
分析后可以发现是因为有1的存在
分为两种情况

  1. 以 1 开头的字串, 数量为窗口内 1 的个数
  2. 第二种就是上面例子中 01 这样的 前面0的个数太少 这样的有多少个?同样是 1 的个数

我们换一个例子 0010101,窗口会来到 l = 1, r = 7, cnt1 = 3(窗口内1的个数)
010101, 10101
0101, 101
01, 1
这些都是不满足的 也就是1的个数乘2

代码

import java.util.*;

class Main {
    static final int MAXN = (int) (1e5 + 10);
    static char[] chs = new char[MAXN];
    static long res = 0;
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        int n = s.length();
        for(int i = 1; i <= n; i++){
            chs[i] = s.charAt(i - 1);
        }
        int cnt1 = 0, cnt0 = 0;
        for(int l = 1, r = 1; r <= n; r++){
            if(chs[r] == '0')
                cnt0++;
            else{
                cnt1++;
            }

            while(cnt1 >= cnt0 && l <= r){
                if(chs[l] == '0')
                    cnt0--;
                else
                    cnt1--;
                l++;
            }
            res += (r - l + 1);
            res -= 2L * cnt1;
        }
        System.out.println(res);
    }
}

标签:24,子串,01,窗口,游游,例子,static,秋招
From: https://www.cnblogs.com/ganyq/p/18139878

相关文章

  • P2178 [NOI2015] 品酒大会 题解(评分:8.0)(2024.2.23)
    前言"I'mfree."做法与题解区都不同,虽然麻烦,但是毕竟复杂度是对的,而且想法很自然,还是写一写吧!Solution题意:给定长为\(n\)的字符串\(s\)和长为\(n\)的数组\(A\),对于每个\(r\),求满足\(\text{LCP}(\text{Suffix}(x),\text{Suffix}(y))\ger,x<y\)的数对\((x,y)\)数......
  • 2024年04月17日 凌晨3点的梦——我是一个么得感情的杀手
    接了一单杀手生意,我自己有一把枪,在空旷的田野上试抢瞄准射击。然后有人来了挡住了我的目标位置,我让他们让一让,不然我打不中我这单子做不成,钱要退回去还得赔违约金。他们让开了。然后我试了一下小手枪的威力,打在门上的玻璃,结果玻璃裂了,我说这威力还可以哎。然后玻璃里面就有血色......
  • PR2024教程-2.1 pr2024安装教程
    下载地址:伊梦老师素材安装文件目录:伊梦/pr2024素材/q全家桶/2024Win版/2023年10月版/一键安装激活版/AdobePremierePr2024v24.0.0.58安装流程:安装pr选择pr安装位置和语言(注意的是尽量把pr扔到有很大剩余空间的盘因为视频缓存视频本身自动保存等等都需要占用很......
  • 20240416打卡
    第八周第一天第二天第三天第四天第五天第六天第七天所花时间5h5h代码量(行)4690博客量(篇)11知识点了解完成了地铁查询系统完成团队开发演讲......
  • 20240415打卡
    第八周第一天第二天第三天第四天第五天第六天第七天所花时间5h代码量(行)469博客量(篇)1知识点了解完成了地铁查询系统......
  • 2024.4.16python基础学习
    基本数据类型numberintmoney=6600floatdiscount=1.2boolenisok=trueisok=falsestrings='sssss's="ssssss"ps:单引号与双引号成对出现,不可以混合使用可以单引号嵌套双引号,互相嵌套list(列表)my_list=['足球','篮球']tuple(元组)my_tuple=(12,123,1234)dict(字典)......
  • 24点求解器
    \(24\)点求解器,输出任意一组解。#include<bits/stdc++.h>usingnamespacestd;#defineto_stto_string#defineinpush_backtypedefdoubledb;typedefstringst;vector<pair<db,st>>Number;intA,B,C,D;boolOut;voidOutput(){Out=true;puts(&quo......
  • 2024/04/15!!!!!!!!!
    周末国九条、伊朗攻击以色列强度不及预期,国际黄金期货高位巨量放空、美国cpi和ppi不及预期,降息预期进一步降低等等一系列的消息,基本上都对中润资源不利但是国九条中关于分红和退市的规定,对市场的影响最大,我知道国九条对小盘股和垃圾股的不利,对白马股利好,但是没有想到影响来的如此......
  • 20240413
    T1TopcoderSRM567div1Medium-StringGame首先字母表定了之后两个人一定都会把字符串按字母表排序。对于这样的两个字符串,只需要数出两个串中每种字母分别有多少个,然后对着计数数组按字母表顺序比过去,在第一个不一样处更大的字典序小。因此先数一数每个字符串中每个字符出现......
  • 20240412
    T1洛谷P9923Przyciski对于每个\(\texttt{1}\),将其所在行与列连边。最终构成的图显然是二分图。我们希望能在图中选出若干条边,使得原图的点集和选出的边构成的图中每个点度数的奇偶性都相同。以下将度数为奇数的称为奇数解,度数为偶数的称为偶数解。首先如果图中存在环,则一定存......