蓝桥杯:人物相关性分析

news2025/1/20 3:52:44

蓝桥杯:人物相关性分析https://www.lanqiao.cn/problems/198/learning/

目录

题目描述   

输入描述

输出描述

输入输出样例

输入

输出

输入

输出

运行限制

题目分析:(滑动窗口)

AC代码(JAVA)


题目描述   

        小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。

        更准确的说,小明定义 Alice 和 Bob "同时出现" 的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。

        例如以下文本:

This is a story about Alice and Bob.Alice wants to send a private message to Bob.

        假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是"Alice and Bob" 和 "Bob. Alice"。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。

注意:

  1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。

  2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如出现了 Bobbi 并不算出现了 Bob。

输入描述

        第一行包含一个整数 K(1≤K≤10^{6})。

        第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 10^{6}

输出描述

输出一个整数,表示 Alice 和 Bob 同时出现的次数。

输入输出样例

输入

20
This is a story about Alice and Bob.Alice wants to send a private message to Bob.

输出

2

输入

1000
Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.

输出

191784

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题目分析:(滑动窗口)

        我们需要记录下每个Alice和Bob出现的下标,记录Alice和Bob这两个单词首字母出现的下标,方便后续进行操作,不然每次搜索Alice的时候都需要进行equals判断,耗时非常高的。

        遍历给定字符串str,我们分别记录下Alice和Bob出现的下标,分别存储到两个数组中,并且记录长度。

        判断出现的下标的时候,首先判断头部是A还是B,如果是A,那么就需要判断末尾是否位e,则判断后面第四位是不是e。

        B同理,同样需要判断末尾是不是b,也就是判断判断后面第二位是不是b。

        如果是了,就在进行字符串截取和比较,与Alice or Bob相同则记录到数组中。

        //处理字符串,存放到对应数组中
        int len = str.length();
        for (int i = 0; i < len; i++) {
            //先判断头尾字符,相同的时候在比较相等
            //Alice
            if (i + 5 <= len && str.charAt(i) == 'A' && str.charAt(i + 4) == 'e') {
                //比较相同
                if (str.substring(i, i + 5).equals("Alice"))
                    Alice[AliceLength++] = i;
            }
            //Bob
            if (i + 3 <= len && str.charAt(i) == 'B' && str.charAt(i + 2) == 'b') {
                //比较相同
                if (str.substring(i, i + 3).equals("Bob"))
                    Bob[BobLength++] = i;
            }
        }

        如果使用双重for循环来遍历Alice和Bob数组的话,肯定会有超时的,但也能拿80%。

        所以我们要考虑进行优化,优化遍历Alice的同时,找到满足不超过K个距离的Bob的出现下标。

        

        如图所示,我们假设这个字符串,Alice的下标是20(A字母第一次出现的下标),K=5,那么,下标在12-30之间出现的Bob都算是合法的,也就是满足题目的“同时出现”.

        至于为什么12也合法,因为Bob在Alice的左边,Bob在Alice的左边的话,是从b这个字符开始计算到A的字符个数,这个之间的间距。但是我们存放Bob出现的下标是存放B出现的下标的,所以需要在B出现下标的基础上+2.

        因此我们在遍历每个Alice的时候,根据其出现的下标,锁定一个区域,在该区域内的Bob都算是合法的。因此我们可以使用双指针进行锁定。

         

        如果我们将图1 的五个间隔符x换成Alice,将其看作第二锅个Alice,那么我们可以得到它的出现下标是25,然后确定它的范围,在 [17,35] 之间出现的Bob都是合法的。

        所以,我们可以根据上图得出,第一个Alice的区间[12,30]是能够和第一个Alice满足“同时出现”的条件的。第二个Alice的区间[17,35]也满足“同时出现”的条件。

        那么,第二个Alice的左区间,是不是在第一个Alice的基础上进行增加的,右区间也是同理。

        因此,我们可以得出,对于任意一个Alice[i+1],它的左右区间一定是大于Alice[i]的。

        因此,我们使用滑动窗口,来确定每一个Alice[i]的区间,在这个区间内的Bob,都视为合法的(也就是满足题目的“同时出现”)。

        并且,对于对于每一个Alice[i+1],我们只需要移动窗口的位置即可,可以大大减少双重for循环遍历Alice的时候也需要重头到尾遍历的次数。可以用此来实现降低时间复杂度。

        那么我们如何计算区间内的合法Bob数量呢?

        这就可以用我们之前使用下标存放Bob的Bob数组了,Bob[i]代表第i个Bob出现的下标.

        我们假设Alice[i]的下标是20,K=5,在上面我们可以知道,它的区间是[12,30],

        也就是我们的区间指针left对应Bob出现的下标,必须小于这个区间,指针right对应Bob出现的下标,必须大于这个这个区间。

        然后right-left,可以得到这个区间具体出现的Bob的数量,也就是对于这个Alice来说,合法的Bob数量。

        真的是如此嘛?

        我们假设left = 0,Bob[left] = 11,满足小于左区间。

        right = 5,Bob[right] = 31,满足大于右边区间。

        那么他们之间一共有几个元素呢? 1 2 3 4 ,一共有4个合法的Bob数量,但是如果直接用right-left的话,得到的应该是5,所以锁定左区间在0是不对的,我们可以让左区间继续累加。

        也就是当Bob[left] 还是小于 左区间的时候,让left继续自增。直到不满足条件,也就是Bob[left] 不小于 左区间,这时候left代表的就算第一个合法的Bob,然后令right-left,即可满足条件,如 5-1 = 4,一共有4个合法的Bob区间。

        因此本题可以使用滑动窗口来记录对于每一个Alice来说,合法的Bob数量,然后进行统计即可。

AC代码(Java)

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static String str;
    static int K;

    static void init() {
        Scanner scan = new Scanner(System.in);
        K = Integer.parseInt(scan.nextLine());
        str = scan.nextLine();
        scan.close();
    }

    static int[] Alice = new int[1000000];
    static int AliceLength = 0;
    static int[] Bob = new int[1000000];
    static int BobLength = 0;

    public static void main(String[] args) {
        init();
        //处理字符串,存放到对应数组中
        int len = str.length();
        for (int i = 0; i < len; i++) {
            //先判断头尾字符,相同的时候在比较相等
            //Alice
            if (i + 5 <= len && str.charAt(i) == 'A' && str.charAt(i + 4) == 'e') {
                //比较相同
                if (str.substring(i, i + 5).equals("Alice"))
                    Alice[AliceLength++] = i;
            }
            //Bob
            if (i + 3 <= len && str.charAt(i) == 'B' && str.charAt(i + 2) == 'b') {
                //比较相同
                if (str.substring(i, i + 3).equals("Bob"))
                    Bob[BobLength++] = i;
            }
        }

        //滑动窗口找答案
        long ans = 0;
        int left = 0;
        int right = 0;
        //遍历Alice,找Bob
        for (int i = 0; i < AliceLength; i++) {
            //收缩左边界,如果Bob[left] 小于 左边界,则继续收缩
            while (left < BobLength && Bob[left] < Alice[i] - K - 3) {
                left++;
            }
            //扩展右边界  如果Bob[right] 小于右边界,必须令其扩展,直到超出右边界
            while (right < BobLength && Bob[right] < Alice[i] + K + 5) {
                right++;
            }
            ans += Math.max((right - left), 0);
        }

        System.out.println(ans);
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ChatGPT】无需魔法打开即用的 AI 工具集锦

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

原理+配置+实战,Canal一套带走

前几天在网上冲浪的时候发现了一个比较成熟的开源中间件——Canal。在了解了它的工作原理和使用场景后&#xff0c;顿时产生了浓厚的兴趣。今天&#xff0c;就让我们跟随阿Q的脚步&#xff0c;一起来揭开它神秘的面纱吧。 简介 canal 翻译为管道&#xff0c;主要用途是基于 M…

【设计】【Redis】分布式限流与算法实现

目录 前言实现application.propertiesconfig.RedisConfigMainApplicationcontroller.TrafficLimitControlleraop.AccessLimiterAspectaop.annotation.AccessLimiter 项目结构运行限流脚本计数器滑动窗口令牌桶漏桶 参考资料 前言 服务的某些场景可能会出现短时间内的巨大访问流…

【C语言进阶:动态内存管理】柔性数组

本节重点内容&#xff1a; 柔性数组的特点柔性数组的使用柔性数组的优势 ⚡柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。C99 中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c…

java+ssm 社区超市网上商城果蔬(水果蔬菜)管理系统

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括超市果蔬管理系统的网络应用&#xff0c;在外国超市果蔬管理系统已经是很普遍的方式&#xff0c;不过国内的超市果蔬管理系统可能还处于起步阶段。超市果蔬管理系统具有果蔬管…

Flutter系列(八)搜索框详解

底部导航顶部导航图片列表的完整代码 Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 目录 一、前言 二、搜索框实现方案 三、完整工程代码 1. 自定义的搜索框组件SearchAppBar search.dart 2. 搜索详情页 search…

Java岗五面阿里,终拿offer,原来面试官总喜欢问这些问题

一面 一面就做了一道算法题&#xff0c;要求两小时内完成&#xff0c;给了长度为N的有重复元素的数组&#xff0c;要求输出第10大的数。典型的TopK问题&#xff0c;快排算法搞定。 算法题要注意的是合法性校验、边界条件以及异常的处理。另外&#xff0c;如果要写测试用例&am…

v1.5宝可梦综合耐久最大化计算器

版本更新v1.5 链接&#xff1a;https://pan.baidu.com/s/1JseHNYnAqIuSpg5f3k6Hbw?pwd01gy 提取码&#xff1a;01gy 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 更新说明 1.增加了特性威吓、灾祸之鼎、灾祸之简 使用说明 1.种族值&#xff1a;查百科获取…

Jmeter5.1.1报错:java.net.BindException: Address already in use: connect

Jmeter5.1.1报错&#xff1a;java.net.BindException: Address already in use: connect 原因&#xff1a;从网上找到资料&#xff1a;端口占用 Windows提供给TCP/IP链接的端口为 1024-5000&#xff0c;并且要四分钟来循环回收它们&#xff0c;就导致我们在短时间内跑大量的请…

【数据库】学习数据库该了解的基本知识

前言 在学习数据库之前&#xff0c;我们先要明确&#xff0c;sql是编程语言&#xff1b;Oracle&#xff0c;Mysql&#xff0c;SQL Server这些是数据库软件&#xff0c;sql这个语言是运行在数据库软件上的&#xff08;就像Java运行在jvm上一样&#xff09; 1、常见的关系型数据库…

HAProxy的安装、详细配置与实际应用(MyCAT、RabbitMQ示例)

HAProxy的安装、配置与实际应用 HAProxyHAProxy概述下载编译安装配置启动验证配置RabbitMQ的HAProxy示例 HAProxy HAProxy概述 HAProxy&#xff08;High Availability Proxy&#xff09;是一款自由、快速、可靠的TCP/HTTP负载均衡软件&#xff0c;其最常见的用途是将客户端请求…

使用signapk工具给apk系统签名

使用signapk给apk系统签名&#xff1a; 1、准备signapk.jar文件 查找路径&#xff1a; .\out\host\linux-x86\framework\signapk.jar 2、platform.x509.pem 和 platform.pk8 查找路径&#xff1a; .\vendor\prima\customer\certificatekey\prima 3、重点&#xff1a;将sdk…

Mac的PATH环境变量及相关文件加载顺序详细解释

系统级变量 /etc/profile /etc/paths 用户级变量(前3个按照从前往后的顺序读取&#xff0c;如果~/.bash_profile文件存在&#xff0c;则后面的几个文件就会被忽略不读了&#xff0c;如果~/.bash_profile文件不存在&#xff0c;才会以此类推读取后面的文件。~/.bashrc没有上述…

数据结构 | 排序 - 总结

排序的方式 排序的稳定性 什么是排序的稳定性&#xff1f; 不改变相同数据的相对顺序 排序的稳定性有什么意义&#xff1f; 假定一个场景&#xff1a; 一组成绩&#xff1a;100&#xff0c;88&#xff0c;98&#xff0c;98&#xff0c;78&#xff0c;100&#xff08;按交卷顺序…

【数据结构】队列(循环队列和链队列)详细讲解各种操作

&#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 图片来源网络&#xff0c;如果侵权&#xff0c;请联系我 目录 ⭐队…

爱智EdgerOS之深入解析离线下载任务

一、需求分析 在日常使用计算机的过程中&#xff0c;看到喜欢的资源不可避免地想把它下载到我们的设备上保存下来&#xff0c;比如图片&#xff0c;音视频资源&#xff0c;文档资源等&#xff0c;基于这种应用场景&#xff0c;现在来看看在爱智设备上可以如何实现呢&#xff1…

日撸 Java 三百行day33

文章目录 说明day33 图的广度优先遍历1.思路2.多个连通分量2 代码实现 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/sampled…

82.qt qml-2D粒子系统、粒子方向、粒子项(一)

由于粒子系统相关的类比较多, 所以本章参考自QmlBook in chinese的粒子章节配合学习: 由于QmlBook in chinese翻译过来的文字有些比较难理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 1.介绍 粒子模拟的核心是粒子系统(Partic…

ResNet残差网络

ResNet 目的 Resnet网络是为了解决深度网络中的退化问题&#xff0c;即网络层数越深时&#xff0c;在数据集上表现的性能却越差。 原理 ResNet的单元结构如下&#xff1a; 类似动态规划的选择性继承&#xff0c;同时会在训练过程中逐渐增大&#xff08;/缩小&#xff09;该…

数字图像基础【7】应用线性回归最小二乘法(矩阵版本)求解几何变换(仿射、透视)

这一章主要讲图像几何变换模型&#xff0c;可能很多同学会想几何变换还不简单嚒&#xff1f;平移缩放旋转。在传统的或者说在同一维度上的基础变换确实是这三个&#xff0c;但是今天学习的是2d图像转投到3d拼接的基础变换过程。总共包含五个变换——平移、刚性、相似、仿射、透…