首页 > 其他分享 >P8796 [蓝桥杯 2022 国 AC] 替换字符

P8796 [蓝桥杯 2022 国 AC] 替换字符

时间:2024-10-22 14:23:58浏览次数:1  
标签:AC rr int LL len P8796 蓝桥 leq 线段

题目大意

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

输入的第一行包含一个字符串 \(s\)。

第二行包含一个整数 \(m\)。

接下来 \(m\) 行,每行包含 \(4\) 个参数 \(l_i,r_i,x_i,y_i\),相邻两个参数之间用一个空格分隔,其中 \(l_i,r_i\) 为整数,\(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\) 的长度。

思路

因为不会线段树分裂合并只能用普通做法。

按照题目开 \(26\) 棵权值线段树。

对于修改操作,我们遍历要修改的 \(x\) 线段树。

如果当前区间全为 \(x\) 那么直接在 \(y\) 那颗树上修改并打上覆盖标记。

    if(ll>=l&&rr<=r&&sum(x,p)==rr-ll+1){
        sum(y,p)=sum(x,p);
        sum(x,p)=0;
        chg(y,p)=1;chg(x,p)=0;
        return ;
    }

输出答案时,直接遍历 \(26\) 棵线段树即可。

注意线段树的空间

Code

#include<bits/stdc++.h>
using namespace std;
#define LL int
#define Ld long double
#define sum(k,p) tree[k][p].sum
#define chg(k,p) tree[k][p].chg
const int N = 100005,M=100005;

LL m,l,r,n;
char ch[N],x,y;
struct Segment_tree{
    LL sum,chg;
}tree[26][N*4];

void build(LL p,LL l,LL r){
    for(int i=0;i<26;i++)chg(i,p)=-1;
    if(l==r){
        sum(ch[l]-'a',p)=1;
        return ;
    }
    LL mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    for(int i=0;i<26;i++) sum(i,p)=sum(i,p<<1)+sum(i,p<<1|1);
    return ;
}

void pushdown(LL p,LL k,LL l,LL r,LL mid){
    if(chg(k,p)==-1) return ;
    sum(k,p<<1)=(mid-l+1)*chg(k,p);
    sum(k,p<<1|1)=(r-mid)*chg(k,p);
    chg(k,p<<1)=chg(k,p<<1|1)=chg(k,p);
    chg(k,p)=-1;
    return ;
}

void pushup(LL p,LL k){
    sum(k,p)=sum(k,p<<1)+sum(k,p<<1|1);
    return ;
}

void change(LL p,LL l,LL r,LL x,LL y,LL ll,LL rr){
    if(!sum(x,p)) return ;
    if(ll>=l&&rr<=r&&sum(x,p)==rr-ll+1){
        sum(y,p)=sum(x,p);
        sum(x,p)=0;
        chg(y,p)=1;chg(x,p)=0;
        return ;
    }
    LL mid=(ll+rr)>>1;
    pushdown(p,x,ll,rr,mid);
    pushdown(p,y,ll,rr,mid);
    if(l<=mid) change(p<<1,l,r,x,y,ll,mid);
    if(r>mid) change(p<<1|1,l,r,x,y,mid+1,rr);
    pushup(p,x);
    pushup(p,y);
    return ;
}

void out(LL p,LL l,LL r){
    if(l==r){
        for(int i=0;i<26;i++){
            if(sum(i,p)!=0){
                cout<<(char)(i+97);
                break;
            }
        }
        return ;
    }
    LL mid=(l+r)>>1;
    for(int i=0;i<26;i++) pushdown(p,i,l,r,mid);
    out(p<<1,l,mid);
    out(p<<1|1,mid+1,r);
    return ;
}

signed main(){
    cin>>ch+1;
    LL len=strlen(ch+1);
    build(1,1,len);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>l>>r>>x>>y;
        change(1,l,r,x-'a',y-'a',1,len);
    }
    out(1,1,len);
    return 0;
}

发布时间:2022-11-14 15:03

标签:AC,rr,int,LL,len,P8796,蓝桥,leq,线段
From: https://www.cnblogs.com/xingke233/p/18492622

相关文章

  • Webpack5-Image
    处理图片资源过去在Webpack4时,我们处理图片资源通过file-loader和url-loader进行处理现在Webpack5已经将两个Loader功能内置到Webpack里了,我们只需要简单配置即可处理图片资源1.配置constpath=require("path");module.exports={entry:"./src/main.js"......
  • Webpack5-修改输出资源的名称和路径
    修改输出资源的名称和路径1.配置constpath=require("path");module.exports={entry:"./src/main.js",output:{path:path.resolve(__dirname,"dist"),filename:"static/js/main.js",//将js文件输出到static/js目录中......
  • 关于spring.cloud.nacos.config.import配置不生效问题
    从SpringCloudAlibaba2.2.0.RELEASE版本开始,spring.cloud.nacos.config.import被废弃,取而代之的是spring.cloud.nacos.config.extension-configs。spring:application:name:gateway-servicecloud:nacos:discovery:server-addr:127.0.0.......
  • Taro 鸿蒙技术内幕系列(一):如何将 React 代码跑在 ArkUI 上
    作者:京东零售朱鸣辉   基于Taro打造的京东鸿蒙APP已跟随鸿蒙Next系统公测,本系列文章将深入解析Taro如何实现使用React开发高性能鸿蒙应用的技术内幕背景随着鸿蒙操作系统的快速发展,开发者们期待将现有跨平台应用迁移到鸿蒙平台。Taro作为一个流行的跨平台开......
  • Webpack5-css
    处理样式资源本章节我们学习使用Webpack如何处理Css、Less、Sass、Scss、Styl样式资源介绍Webpack本身是不能识别样式资源的,所以我们需要借助Loader来帮助Webpack解析样式资源我们找Loader都应该去官方文档中找到对应的Loader,然后使用官方文档找不到的话,可以从社......
  • React和Vue哪个更适合前端开发
    在前端开发领域,React和Vue一直是两大热门框架。本文深入对比两者在不同维度的表现,包括:1.设计理念和学习曲线;2.数据绑定;3.组件化;4.生态系统和工具;5.性能;6.社区支持;7.企业采用和工作机会。通过全面的比较分析,我们可以发现React和Vue各有优势,选择哪一个框架更多地取决于项目......
  • 蓝桥杯基本操作和运算
    文章目录1.基本运算2.循环--进制转换/最大公约数2.1进制转换2.2求解最大公约数3.数组与字符串4.常用的API5.快速读写模版蓝桥杯基本操作和运算10-22号正式开始准备蓝桥杯的比赛,准备参加这个大学B组的Java的赛项1.基本运算首先就是基本的输入输出:system.out.pr......
  • Access 与Excel 最重要的区别是什么
    Access与Excel最重要的区别是:一、用途不同;二、数据结构不同;三、功能不同;四、数据容量和性能不同;五、多用户并发处理能力不同;六、安全性和权限控制不同;七、扩展性和集成性不同。用途不同在于,Access适用于创建和管理大量结构化数据的数据库系统,Excel则适用于数据分析、计算和图表......
  • 苹果笔记本和微软Surface哪个更适合商务使用
    在商务环境中,选择合适的笔记本电脑对于提高工作效率至关重要。本文对苹果笔记本和微软Surface进行比较分析,探讨哪种更适合商务使用。主要考虑因素包括:1.性能和可靠性;2.操作系统与软件兼容性;3.设计与便携性;4.电池续航力;5.价格与性价比;6.售后服务与支持。通过全面的比较分析,可以帮......
  • 第6天:Intent和页面导航-补充材料——`MainActivity.kt`解读
    下面是对“第6天:Intent和页面导航”该文学习的更深层次的补充材料,对MainActivity.kt文件的理解。下面对`MainActivity.kt’文件中每一行进行详细解释:packagecom.example.intentdemo定义包名:这行代码指定了当前Kotlin文件所属的包。在Android项目中,包名通常是由反向......