Acwing4993. FEB

题目

有一个长度为 N 的字符串 S,其中的每个字符要么是 B,要么是 E

我们规定 S 的价值等于其中包含的子串 BB 以及子串 EE 的数量之和。

例如,BBBEEE 中包含 22 个 BB 以及 22 个 EE,所以 BBBEEE 的价值等于 44。

我们想要计算 S 的价值,不幸的是,在我们得到 S 之前,约翰将其中的一些字符改为了 F

目前,我们只能看到改动后的字符串 S,对于其中的每个 F,我们并不清楚它之前是 B 还是 E

请你计算,改动前的 S 有多少种可能的价值并将所有可能价值全部输出。

输入格式

第一行包含一个整数 N

第二行包含改动后的字符串 S

输出格式

第一行输出一个整数 K,表示改动前的 S 的可能价值的数量。

接下来 K 行,按照升序顺序,每行输出一个可能价值。

数据范围

1≤N≤2×10^5

输入样例1:
4
BEEF
输出样例1:
2
1
2
输入样例2:
9
FEBFEBFEB
输出样例2:
2
2
3
输入样例3:
10
BFFFFFEBFE
输出样例3:
3
2
4
6

思路与代码

这道题没有模板可以套,所以我们要分类讨论。如果全部都是F的话证明价值从0-n都可以。如果不是就更具体讨论了。具体讨论如下(这里的low地点和high高点分别是最小价值和最高价值):

  1. 寻找第一个和最后一个非F字符的位置:

    • 使用两个指针 lr,分别初始化为字符串的开头和结尾。
    • while 循环找到第一个非 ‘F’ 的字符的位置,分别赋给 lr
  2. 计算低点:

    • 创建一个 StringBuilder 对象 str,将其初始化为输入字符串 s
    • lr 的范围内遍历字符串。
    • 如果当前字符是 ‘F’,则将其修改为 ‘B’ 或 ‘E’,使得相邻字符不相同。
    • 如果当前字符与前一个字符相同(即 str.charAt(i) == str.charAt(i - 1)),则增加 low 计数。
  3. 计算高点:

    • lr 的范围内遍历字符串。
    • 如果当前字符是 ‘F’,则将其修改为与前一个字符相同。
    • 如果当前字符与前一个字符相同(即 str.charAt(i) == str.charAt(i - 1)),则增加 high 计数。
  4. 计算结束的范围和步长:

    • 计算从 lr 之间的字符个数(即 ends = l + n - 1 - r)。
    • 如果 ends 大于 0,说明字符串在两端有一些 ‘F’,需要计入 high 中,此时将 high 增加 ends,并将步长 d 设置为 1。
  5. 输出结果:

    • 计算 high - low 的结果除以步长 d,并加上 1,得到最终输出的范围。
    • lowhigh 按照步长 d 遍历,输出结果
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取输入int n = scanner.nextInt();String s = scanner.next();if (s.equals(new String(new char[n]).replace('\0', 'F'))) {// 如果全是F,输出整个范围System.out.println(n);for (int i = 0; i < n; i++) {System.out.println(i);}} else {// 寻找第一个和最后一个非F字符的位置int l = 0, r = n - 1;while (s.charAt(l) == 'F') l++;while (s.charAt(r) == 'F') r--;int low = 0, high = 0;StringBuilder str = new StringBuilder(s);// 计算低点for (int i = l; i <= r; i++) {if (str.charAt(i) == 'F') {if (str.charAt(i - 1) == 'B') str.setCharAt(i, 'E');else str.setCharAt(i, 'B');}if (i > l && str.charAt(i) == str.charAt(i - 1)) low++;}// 重置字符串str = new StringBuilder(s);// 计算高点for (int i = l; i <= r; i++) {if (str.charAt(i) == 'F') str.setCharAt(i, str.charAt(i - 1));if (i > l && str.charAt(i) == str.charAt(i - 1)) high++;}// 计算结束的范围和步长int ends = l + n - 1 - r, d = 2;if (ends > 0) {high += ends;d = 1;}// 输出结果System.out.println((high - low) / d + 1);for (int i = low; i <= high; i += d)System.out.println(i);}}
}

接着我们结合第一个测试用例来理解这个代码

输入样例1:

4
BEEF

输出样例1:

2
1
2

结合用例理解

执行到这串代码的时候:

while (s.charAt(l) == 'F') {  l++;  
}  
while (s.charAt(r) == 'F') {  r--;  
}

l还是0,r变为2

计算低点

  • 执行到计算低点的代码时候,当i=2时,进来low++,所以low=1

  • 然后执行到i=3时,因为已经把F替换为跟前面一个字符不同的字符,所以进不到low++的判断

计算高点

  • 当i=2时,进入到了high判断里,high++了,high=1

计算ends

  • 主要是为了计算左右两端的F个数,因为左右两端有多少个 ‘F’ 的原因是我们希望每个 ‘F’ 都能够独立地成为一个分组。在计算高点 high 时,我们希望每个 ‘F’ 能够单独计数,因此需要考虑两端的 ‘F’ 个数
  • 所以在这里计算出ends=1,然后d就被设置为1,步长为1,高点就再加上1

输出:

  • (high - low) / d + 1 的计算是为了确定最终输出的分组数量
  • 步长 d 表示每次增加的索引步长,保证了每个 ‘F’ 只能被计数一次

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

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

相关文章

技术浪潮中的职业变革:程序员面临的裁员挑战与应对策略

目录 前言 冲破时空壁垒&#xff1a;探索技术变革的酷时代&#xff01; 逆境成长&#xff1a;一个互联网人战胜失业困境的故事 裁员的双面影响&#xff1a;挑战与机遇 应对裁员潮危机&#xff1a;程序员的超级英雄之路 前言 惊人的新闻传来&#xff0c;一对来自中国的工程师…

基于神经网络的电力系统的负荷预测

一、背景介绍&#xff1a; 电力系统负荷预测是生产部门的重要工作之一&#xff0c;通过准确的负荷预测&#xff0c;可以经济合理地安排机组的启停、减少旋转备用容量、合理安排检修计划、降低发电成本和提高经济效益。负荷预测按预测的时间可以分为长期、中期和短期负荷预测。…

MySQL慢查询日志

慢查询日志 MySQL的慢查询日志是用来记录MySQL响应时间超过阈值的语句&#xff0c;即为超过long_query_time值得sql语句 默认没有开启慢查询(如果开启慢查询会导致性能降低) 慢日志配置 查看是否开启慢查询 show variables like %slow_query_log%; 开启慢查询 #只对当前数据库生…

​​快速排序(四)——挖坑法,前后指针法与非递归

目录 ​一.前言 二.挖坑法 三.前后指针法 四.递归优化 五.非递归 六.结语 一.前言 本文我们接着上篇文章的重点快排&#xff0c;现在继续讲解对快排优化的挖坑法&#xff0c;前后指针法以及非递归方法&#xff0c;下面是上篇文章快排链接&#xff1a;https://mp.csdn.net…

C#,字符串匹配(模式搜索)有限自动机(Finite Automata)算法的源代码

一、有限状态自动机 图中两个圆圈&#xff0c;也叫节点&#xff0c;用于表示状态&#xff0c;从图中可以看成&#xff0c;它有两个状态&#xff0c;分别叫0和1。从每个节点出发&#xff0c;都会有若干条边。当处于某个状态时&#xff0c;如果输入的字符跟该节点出发的某条边的内…

题记(25)--继续畅通工程

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;。现得到城…

grpc java 编译小记

有关grpc的前置知识&#xff1a;gRPC 相关依赖 io.grpc:grpc-netty-shaded:1.61.0 - 这是gRPC框架的一个库&#xff0c;提供Netty实现以支持gRPC的网络通信。 io.grpc:grpc-protobuf:1.61.0 - 这是gRPC框架的一个库&#xff0c;提供对Protocol Buffers的支持&#xff0c;用于定…

网络安全的介绍

1.什么是网络安全 网络安全是一门关注保护计算机系统、网络基础设施和数据免受未经授权访问、破坏或窃取的学科。随着数字化时代的发展&#xff0c;网络安全变得尤为重要&#xff0c;因为大量的个人信息、商业机密和政府数据都储存在电子设备和云端系统中。以下是网络安全的概…

用Axure RP 9制作滑块

制作流程 1.打开界面 放置一个水平线 修改长为400 线段为5 2.放入圆 如图 3.修改圆的长和宽 如图 4.将圆变成动态面板 5.设置交互事件 如图 6.增加交互事件 7.增加 8.修改成跟随水平

基于springboot+vue的网上点餐系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

php基础学习之数据类型

php数据类型的基本概念 数据类型&#xff1a;data type&#xff0c;在PHP中指的是数据本身的类型&#xff0c;而不是变量的类型。 PHP 是一种弱类型语言&#xff0c;变量本身没有数据类型。 把变量类比成一个杯子&#xff08;容器&#xff09;&#xff0c;杯子可以装雪碧、可…

STL之unordered_map使用方法

这里写目录标题 STL之unordered_map使用方法1.什么是STL呢2.unordered_map2.1 头文件&#xff1a;2.2 怎么创建&#xff1a;2.3 初始化&#xff1a;2.4 根据key获取对应value值&#xff1a;2.5 遍历&#xff0c;判断key是否存在&#xff1a;2.6 怎么根据迭代器it获取key和value…

openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert

文章目录 openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert概述笔记END openssl3.2/test/certs - 015 - Primary intermediate ca: ca-cert 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 这个例子有不同的地方, 发证书时, 指定了CA. 看实验注释, 是…

Jenkins中文插件安装与使用

安装中文插件 进入Jenkins的系统管理—插件管理&#xff0c;选择Available plugins搜索Locale&#xff0c;进行下载安装 使用 安装完成之后&#xff0c;进入系统配置&#xff0c;找到Locale&#xff0c;Default Language输入zh_CN为中文模式&#xff0c;输入en_US为英文模式 …

Flutter 自定义AppBar实现滚动渐变

1、使用ListView实现上下滚动。 2、使用Stack&#xff1a;允许将其子部件放在彼此的顶部&#xff0c;第一个子部件将放置在底部。所以AppBar&#xff0c;写在ListView下面。 3、MediaQuery.removePadding&#xff1a;当使用ListView的时候发现&#xff0c;顶部有块默认的Padd…

数据的存储

目录 1 -> 数据类型的介绍 1.1 -> 类型的基本归类 2 -> 整型在内存中的存储 2.1 -> 原码、反码、补码 2.2 -> 大小端介绍 3 -> 浮点型在内存中的存储 3.1 -> 浮点数存储规则 1 -> 数据类型的介绍 基本内置类型有&#xff1a; char /…

视频转换成文字,原来转换的方法这么简单!

在我们的生活中&#xff0c;不少小伙伴是否遇到过这样的情况&#xff1f;观看网络视频时&#xff0c;由于解说内容极为引人入胜&#xff0c;忍不住想将其内容记录下来&#xff0c;但这手动逐句整理的过程既耗时又费力。幸运的是&#xff0c;经过一番努力查找&#xff0c;确实有…

【C++杂货铺】三分钟彻底搞懂如何使用C++中max函数

&#x1f308;前言 欢迎收看本期【C杂货铺】&#xff0c;这期内容&#xff0c;我们将围绕C中max函数部分进行讲解&#xff0c;包含了如何查询库函数&#xff0c;max函数的使用方法灯。如果你想学习C&#xff0c;或者刚学完C语言衔接C&#xff0c;那么这篇文章将会非常有效的帮助…

RC滤波电路的原理

RC滤波电路分为低通滤波和高通滤波 低通滤波通过低频信号 看上面这两个电路 先分析低通滤波 由于电容C具有隔直通交的特性&#xff0c;所以输入的高频分量相当于经过电阻R后直接对地短接&#xff0c;并没有输出到后端负载上&#xff0c;只有低频的输入分量才会输出到后端。 电…

JAVA输入任意一个数字,实现递减求和(计算任意整数n的和)

摘要&#xff1a;本文介绍了使用Java编程语言计算任意整数n及其之前所有整数的和的示例代码。代码使用了Scanner类来读取用户输入的整数值&#xff0c;并通过循环计算出和结果并生成计算公式字符串。 内容&#xff1a; 在这个示例中&#xff0c;我们将展示如何使用Java编程语言…