题面

给定一个仅含小写英文字母的字符串 \(s\) 和 \(m\) 次操作,每次操作选择一个区间 \([l_i,r_i]\) 将 \(s\) 的该区间中的所有字母 \(x_i\) 全部替换成字母 \(y_i\),问所有操作做完后,得到的字符串是什么。

对于所有评测用例,\(1 \leq |s|, m \leq 10^5\),\(1 \leq l_i \leq r_i \leq |s|\),\(x_i\neq y_i\),其中 \(|s|\) 表示字符串 \(s\) 的长度。

思路

首先我写了一个蹩脚的 FHQ-Treap,后来被我证伪了……

其实这道题是一个线段树合并 / 分裂 水题。

首先先按照 \(s\) 的值域建出 \(26\) 棵线段树。对于每一个 \(s_i\),用第 \(s_i\) 个线段树将第 \(i\) 个元素修改为 \(1\)(也就是,存在)。

然后修改的时候直接将 \([l_i,r_i]\) 从第 \(x_i\) 个线段树上分裂下来,合并到第 \(y_i\) 个线段树上,也就可以了。

最后输出的时候暴力枚举值域,找到存在的输出即可。

时间复杂度 \(O(m\log|s_i|)\)。

另外本题有双倍经验 Codeforces911G Mass Change Queries,代码就不放了,具体看 Codeforces 提交记录

代码

#include <bits/stdc++.h>
#define int long long
#define ls(i) (t[i].ls)
#define rs(i) (t[i].rs)
#define mid ((l+r)>>1)
using namespace std; const int N = 1e5+5;
struct node{
int ls,rs,v;
} t[N<<8];
int root[30],tot; inline void newnode(int &i){
if(!i)i=(++tot);
} void update(int p,int v,int &i,int l,int r){
newnode(i);
if(l==r){
t[i].v=v;
return;
}
if(p<=mid){
update(p,v,ls(i),l,mid);
}
else{
update(p,v,rs(i),mid+1,r);
}
} int split(int ql,int qr,int &i,int l,int r){
int p=0;
newnode(p);
if(ql<=l&&r<=qr){
t[p]=t[i];
i=0;
}
else{
if(ql<=mid){
ls(p)=split(ql,qr,ls(i),l,mid);
}
if(qr>mid){
rs(p)=split(ql,qr,rs(i),mid+1,r);
}
}
return p;
} void merge(int &x,int &y){
if(x==0||y==0){
if(y)x=y;
if(x)y=x;
return;
}
t[x].v+=t[y].v;
merge(ls(x),ls(y));
merge(rs(x),rs(y));
} int query(int p,int i,int l,int r){
if(!i)return 0;
if(l==r){
return t[i].v;
}
if(p<=mid){
return query(p,ls(i),l,mid);
}
else{
return query(p,rs(i),mid+1,r);
}
} char s[N];
int n,m; signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>(s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++){
update(i,1,root[s[i]-'a'],1,n);
}
cin>>m;
while(m--){
int li,ri,x,y;char xi,yi;
cin>>li>>ri>>xi>>yi;
x=xi-'a',y=yi-'a';
int ytxy_ak_ioi = split(li,ri,root[x],1,n);
merge(root[y],ytxy_ak_ioi);
}
for(int i=1;i<=n;i++){
for(char j='a';j<='z';j++){
if(query(i,root[j-'a'],1,n)>0){
cout<<j;
break;
}
}
}
return 0;
return 0;
}

AC Record

P8796 [蓝桥杯 2022 国 AC] 替换字符的更多相关文章

  1. Java实现 蓝桥杯VIP 算法训练 判断字符位置

    判定字符位置 时间限制: 1Sec 内存限制: 128MB 提交: 487 解决: 251 题目描述 返回给定字符串s中元音字母的首次出现位置.英语元音字母只有'a'.'e'.'i'.'o'.'u'五 ...

  2. Java实现 蓝桥杯VIP 算法训练 统计字符次数

    算法训练 统计字符次数 时间限制:1.0s 内存限制:512.0MB 输入一个字符串(长度在100以内),统计其中数字字符出现的次数. 样例输入 Ab100cd200 样例输出 6 import ja ...

  3. 平方十位数(蓝桥杯第八届国赛真题 JAVA-B组)

    思路:从大到小枚举,判断其平方是否不重复 答案:9814072356 //水题 标题:平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平 ...

  4. 蓝桥杯2022年java试题

    一:基础练习: (本文只附代码,解析后续修改后添上) 1.a+b问题: 代码如下: 1 import java.util.*; 2 public class Main { 3 public stati ...

  5. 2019年第十届蓝桥杯国赛总结(JavaA组)

    JavaA组国二,可以报销了~ JA死亡之组可不是盖的,rank12的排名还是拿不到国一啊(只有五个.. 出成绩的一刻波澜不惊,毕竟去年有国一了不慌哈哈哈 不过对我来说这个结果还算意料之外吧,毕竟大三 ...

  6. 第九届蓝桥杯国赛+第二天的第11届acm省赛的总结

    第九届蓝桥杯国赛+第二天的第11届acm省赛的总结 25号坐的去北京的火车,10个小时的火车,然后挤了快两个小时的地铁,最终达到了中国矿业大学旁边的订的房间.12个小时很难受,晕车症状有点严重,吃了快 ...

  7. 第九届蓝桥杯JavaC组决(国)赛真题

    1:年龄问题 s夫人一向很神秘.这会儿有人问起她的年龄,她想了想说: "20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍". 你能算出s夫人现在的年龄吗? 这 ...

  8. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  9. 2019第十届蓝桥杯省赛及国赛个人总结(java-B组)

    省赛: 今年省赛的题目比18年简单的多,基本都是暴力枚举.BFS之类.还记得去年在山师考蓝桥杯,我这种辣鸡连题目都没看懂.本以为蓝桥会变得越来越难,没想到今年就被打脸了.今年省赛后面三个编程大题一个没 ...

  10. 【备考06组01号】第四届蓝桥杯JAVA组A组国赛题解

    1.填算式 (1)题目描述     请看下面的算式:     (ABCD - EFGH) * XY = 900     每个字母代表一个0~9的数字,不同字母代表不同数字,首位不能为0.     比如 ...

随机推荐

  1. 教你用canvas打造一个炫酷的碎片切图效果

    前言 今天分享一个炫酷的碎片式切图效果,这个其实在自己的之前的博客上有实现过,本人觉得这个效果还是挺炫酷的,这次还是用我们的canvas来实现,代码量不多,但有些地方还是需要花点时间去理解的,需要点数 ...

  2. 10.APIView视图

    from rest_framework import status from rest_framework.response import Response from snippets.models ...

  3. 【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列

    写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...

  4. 真正“搞”懂HTTP协议03之时间穿梭

    上一篇我们简单的介绍了一下DoD模型和OSI模型,还着重的讲解了TCP的三次握手和四次挥手,让我们在空间层面,稍稍宏观的了解了HTTP所依赖的底层模型,那么这一篇,我们来追溯一下HTTP的历史,看一看 ...

  5. 【炫丽】从0开始做一个WPF+Blazor对话小程序

    大家好,我是沙漠尽头的狼. .NET是免费,跨平台,开源,用于构建所有应用的开发人员平台. 本文演示如何在WPF中使用Blazor开发漂亮的UI,为客户端开发注入新活力. 注 要使WPF支持Blazo ...

  6. YC-Framework版本更新:V1.0.10

    分布式微服务框架:YC-Framework版本更新V1.0.10!!! 本文主要内容: 1.V1.0.10版本更新主要内容2.YC-Framework相关系列文章分享 一.V1.0.10版本更新主要内 ...

  7. 实战中的sudo提权漏洞的使用姿势(CVE-2021-3156)

    实战中的sudo提权漏洞的使用姿势 免责声明: 0x00 漏洞概述 0x01 漏洞原理 0x02 受影响版本 0x03 不受影响版本 0x04 漏洞复现(centos) 复现POC1: 复现POC2: ...

  8. 2022年rhce最新认证—(满分通过)

    RHCE认证 重要配置信息 在考试期间,除了您就坐位置的台式机之外,还将使用多个虚拟系统.您不具有台式机系统的 root 访问权,但具有对虚拟系统的完整 root 访问权. 系统信息 在本考试期间,您 ...

  9. 【Java 并发003】原理层面:Java并发三特性全解析

    一.前言 不管什么语言,并发的编程都是在高级的部分,因为并发的涉及的知识太广,不单单是操作系统的知识,还有计算机的组成的知识等等.说到底,这些年硬件的不断的发展,但是一直有一个核心的矛盾在:CPU.内 ...

  10. JavaWeb实战:基础CRUD+批量删除+分页+条件

    技术栈及相关参考资料: MyBatis基础 Servlet基础 ServletRequest和ServletResponse MVC模式和三层架构 AJAX基础+Axios基础 Vue前端框架 Ele ...