Atcoder ABC341 E - Alternating String

2024-02-27 07:28

本文主要是介绍Atcoder ABC341 E - Alternating String,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Alternating String(交替字符串)

时间限制:3s 内存限制:1024MB

【原题地址】

所有图片源自Atcoder,题目译文源自脚本Atcoder Better!

点击此处跳转至原题

【问题描述】

在这里插入图片描述

【输入格式】

在这里插入图片描述
每个查询
q u e r y i query_i queryi ( 1 ≤ i ≤ Q ) 的形式为:
在这里插入图片描述
或则
在这里插入图片描述
在这里插入图片描述

【输出格式】

在这里插入图片描述

【样例1】

【样例输入1】

5 6
10100
2 1 3
2 1 5
1 1 4
2 1 5
1 3 3
2 2 4

【样例输出1】

Yes
No
Yes
No

【样例说明1】

在这里插入图片描述

【样例2】

【样例输入2】

1 2
1
1 1 1
2 1 1

【样例输出2】

Yes

【样例说明2】

在这里插入图片描述

【解题思路】

老汉使用到的是XXX的解题方式

本题是求当2查询时,判断该给定区间是否为一个好字符串(老汉称之为连续区间),并输出结果。

题外话:
一开始,老汉看到0101,想着用树去替换该字符串,使用异或等符号进行操作,但是进行了好久的操作,依然无法解决该题,后来经过好友大佬提醒,得到了一个做连续区间题型的模板解法,完成了对本题的攻克

正解:
用一个Java提供的树形集合将所有连续区间的左边界存入,当进行2查询时,只要该区间(除该区间的左边界)不存在集合内现有的左边界,代表该区间是一个连续区间;当进行1查询时,当前左边界存在于集合内时,从集合中消除该左边界,因为反转导致该区间变得与上一区间相连,不存在于集合内时,将该左边界加入集合,因为反转导致连续区间从当前位置开始断开,右边界+1位置同理。

代码注释有详细过程

【代码】

package ABC341_E_AlternatingString;import java.util.*;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n = scan.nextInt();int q = scan.nextInt();char[] s = scan.next().toCharArray();// 创建一个树形集合,里面只存放每个连续区间的左边界TreeSet<Integer> set = new TreeSet<Integer>();// 1必然是一个左区间set.add(1);for (int i = 2; i <= n; i++) {if (s[i - 1] == s[i - 2]) {set.add(i);}}set.add(n + 1);while (q-- > 0) {int op = scan.nextInt();int l = scan.nextInt();int r = scan.nextInt();if (op == 2) {// 获取树形集合中小于等于所查询的右边界的最大值int num = set.floor(r);// 当该区间内没有左边界时,代表该区间连续,反之代表不连续if (num <= l) {System.out.println("Yes");} else {System.out.println("No");}} else {// 集合中不存在l时,代表这次改变会将此处断开,向集合添加l,表示新的左边界if (!set.contains(l))set.add(l);// 集合中存在l时,代表这次改变会从此处连接上上一个连续区间,删除集合中的l,表示此处无边界else if (set.contains(l) && l != 1)set.remove(l);// 集合中不存在r+1时,代表这次改变会将后一处断开,向集合添加r+1,表示新的左边界if (!set.contains(r + 1))set.add(r + 1);// 集合中存在r+1时,代表这次改变会从后一处连接上当前区间,删除集合中的r+1,表示此处无边界else if (set.contains(r + 1) && r + 1 != n + 1)set.remove(r + 1);}}scan.close();}
}

这篇关于Atcoder ABC341 E - Alternating String的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751636

相关文章

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

hdu2072(string的应用)

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25447    Accepted Submission(s): 5957 Problem Description lily的好朋友xiaoou333最近很空,他