2023.11.10联赛 T4题解

news2024/9/19 11:40:54

题目大意

题目思路

我们考虑分块处理。

我们可以维护一个状态,表示块内每个字母对应的真实字母,因为只有 3 3 3个字母,所以只有 6 6 6种情况。

对于每一个块,我们可以对于每种状态、每种块,预处理出以 A A A B B B C C C进入出来时是什么字母。

至此,思路就很明了。

修改操作对于散块直接修改,对于整块修改他们的状态。

查询操作对于散块直接跳,对于整块直接用预处理的信息跳即可。

具体实现参考代码。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,a[N],b[N],pos[N],posl[N],posr[N],g[N],sum[N][10][5],p[10][5],vis[5][5][5],block=0,tot=0;
char s[N],s1[200+10],s2[200+10];
int read()
{
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
        s=s*10+(ch-'0'),ch=getchar();
    return s*w;
}
int work(int l,int r,int state,int x)
{
    for(int i=l;i<=r;++i)
    {
        int val=p[state][a[i]];
        if(x%3+1!=val)
            x=val;
    }
    return x;
}
void change(int l,int r,int val1,int val2)
{
    int x=0,y=0;
    for(int i=1;i<=3;++i)
        if(p[g[pos[l]]][i]==val1)
            x=i;    
    for(int i=1;i<=3;++i)
        if(p[g[pos[l]]][i]==val2)
            y=i; 
    for(int i=l;i<=r;++i)
    {
        if(p[g[pos[l]]][a[i]]==val1)
            a[i]=y;
        else if(p[g[pos[l]]][a[i]]==val2)
            a[i]=x;
    }
    for(int i=1;i<=6;++i)   
        for(int j=1;j<=3;++j)
            sum[pos[l]][i][j]=work(posl[pos[l]],posr[pos[r]],i,j);
}   
void update(int l,int r,int val1,int val2)
{
    if(pos[l]==pos[r])
    {
        change(l,r,val1,val2);
        return ;
    }
    change(l,posr[pos[l]],val1,val2);
    for(int i=pos[l]+1;i<=pos[r]-1;++i)
    {
        int c[5];
        for(int j=1;j<=3;++j)
        {
            if(p[g[i]][j]==val1)
                c[j]=val2;
            else if(p[g[i]][j]==val2)
                c[j]=val1;
            else
                c[j]=p[g[i]][j];
        }
        g[i]=vis[c[1]][c[2]][c[3]];
    }
    change(posl[pos[r]],r,val1,val2);
}
int ask(int l,int r,int x)
{
    if(pos[l]==pos[r])
        return work(l,r,g[pos[l]],x);
    x=work(l,posr[pos[l]],g[pos[l]],x);
    for(int i=pos[l]+1;i<=pos[r]-1;++i)
        x=sum[i][g[i]][x];
    x=work(posl[pos[r]],r,g[pos[r]],x);
    return x;
}
int main()
{
    freopen("training.in","r",stdin);
    freopen("training.out","w",stdout);
    n=read(),q=read();
    scanf("%s",s+1);
    block=pow(n,2.0/5.0);
    for(int i=1;i<=n;++i)
        a[i]=s[i]-'A'+1,pos[i]=(i-1)/block+1;
    for(int i=1;i<=pos[n];++i)
    {
        posl[i]=(i-1)*block+1;
        posr[i]=min(i*block,n);
        g[i]=1;
    }
    for(int i=1;i<=3;++i)
        b[i]=i;
    do
    {
        tot++;
        p[tot][1]=b[1];
        p[tot][2]=b[2];
        p[tot][3]=b[3];
        vis[b[1]][b[2]][b[3]]=tot;
        for(int i=1;i<=3;++i)
            for(int j=1;j<=pos[n];++j)
                sum[j][tot][i]=work(posl[j],posr[j],tot,i);
    }while(next_permutation(b+1,b+4));
    while(q--)
    {
        int opt=read(),l=read(),r=read();
        if(opt==0)
        {
            scanf("%s %s",s1+1,s2+1);
            update(l,r,s1[1]-'A'+1,s2[1]-'A'+1);            
        }
        else
        {
            scanf("%s",s1+1);
            printf("%c\n",ask(l,r,s1[1]-'A'+1)+'A'-1);
        }
    }
    return 0;
}

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

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

相关文章

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

19. 深度学习 - 用函数解决问题

文章目录 Hi&#xff0c; 你好。我是茶桁。 上一节课&#xff0c;我们从一个波士顿房价的预测开始写代码&#xff0c;写到了KNN。 之前咱们机器学习课程中有讲到KNN这个算法&#xff0c;分析过其优点和缺点&#xff0c;说起来&#xff0c;KNN这种方法比较低效&#xff0c;在数…

【前端】TypeScript核心知识点讲解

1.TypeScript简介及入门案例 &#xff08;1&#xff09;什么是TypeScript&#xff1f; TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 &#xff08;ES6&#xff09;标准。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大…

ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境

一、前期安装 1、安装ncurses库&#xff08;已经包含了&#xff0c;其他的os需要安装&#xff09; sudo apt install libncurses5二、安装 sudo ./xsetup使用lic进行激活。 三、安装后 输入指令 sudo gedit ~/.bashrc 末尾添加 source /opt/Xilinx/Vivado/2019.1/setti…

串口通信(11)-CRC校验介绍算法

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

条件渲染-if/hidden

1.条件渲染的方法 1.1 wx&#xff1a;if方法&#xff08;少用&#xff09; block只是一个容器&#xff0c;容器内的都用于if判断 1.2 hidden方法 注&#xff1a;view要小写&#xff0c;否则不生效 1.3方法对比

【狂神说Java】Dubbo + Zookeeper

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;狂神说Java &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远…

【java:牛客每日三十题总结-4】

java:牛客每日三十题总结 总结如下 总结如下 集合相关知识点 元素是否排序和插入顺序无关&#xff0c;取决与集合实现是否考虑了传入对象的java.lang.Comparable接口抽象类和接口相关知识 只能说越来越抽象了 java线程通信的方式 在Java中&#xff0c;常用的线程通信方式有两…

轻松下载网页音频和视频

在网页上看到好看的视频或者听到的音乐想保存&#xff0c;让我来教你&#xff08;仅供学习&#xff09; 注意&#xff1a;有极少部分的网站视频经过加密&#xff0c;无法下载 一、视频下载 1.打开视频网页 2.右键“检查” 3.刷新网页 4.按照下图中步骤操作 5.把复制的链接放…

【漏洞复现】BYTEVALUE智能流控路由器存在命令执行

【漏洞介绍】 百为智能流控路由器 /goform/webRead/open 路由的 ?path 参数存在有回显的命令注入漏洞。攻击者可通过该漏洞在服务器端执行命令&#xff0c;写入后门&#xff0c;获取服务器权限&#xff0c;从而获取路由器权限。 【指纹】 title”BYTEVALUE 智能流控路由器”…

C语言C位出道心法(五):内存管理

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体|结构体指针|链表 C语言C位出道心法(三):共用体|枚举 C语言C位出道心法(四):文件操作 C语言C位出道心法(五):内存管理 一:C语言内存管理认知 二:C语言中内存堆|栈认知 三:C语言中引用内存丢失认知

数字档案馆实施方案需要考虑哪些因素

数字档案馆实施方案通常需要考虑以下几个方面&#xff1a; 1. 硬件和软件设备的选择&#xff1a;需要根据数字档案馆的规模和需求选购适当的硬件和软件设备&#xff0c;包括服务器、存储设备、数据库、操作系统、专久智能档案管理系统等。 2. 数据的采集和处理&#xff1a;确定…

idea中搭建Spring boot项目(借助Spring Initializer)

创建新项目 启动端口 在项目配置文件application.properties中写入 #启动端口server.port8088编写测试方法 创建控制类文件夹–>便于规范我们新建一个controller包–>建一个HelloWorld.class package com.example.hellospringboot.controller;import org.springframew…

【工具推荐】一键多平台文章发布神器推荐(免费)

hello&#xff0c;大家好&#xff0c;我是你们老朋友洛林&#xff0c;上一篇文章说到自己深受多平台手动发布的折磨「传送门」&#xff0c;准备开发一款文章多平台工具&#xff0c;后来联系到 Wechatsync 原作者进行了简单的沟通&#xff0c;下面是关于以后的一些规划&#xff…

MySQL 批量修改表的列名为小写

1、获取脚本 SELECT concat( alter table , TABLE_NAME, change column , COLUMN_NAME, , lower( COLUMN_NAME ), , COLUMN_TYPE, comment \, COLUMN_COMMENT, \; ) AS 脚本 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA 数据库名 and TABLE_NAME表名-- 大写是up…

让你认识C++中的模板

目录 一. 泛型编程1、定义 二、函数模板1、定义2、格式3、函数模板的实例化&#xff08;1&#xff09;、强制转化&#xff08;2&#xff09;、显式实例化 三、类模板1、 类模板的定义格式2、实例3、 类模板的实例化 一. 泛型编程 1、定义 泛型编程&#xff1a;编写与类型无关…

Spring封装数据结果

Spring封装数据结果 POST请求JSON格式 基本数据类型 public class Demo {private byte aByte;private short aShort;private int anInt;private long aLong;private float aFloat;private double aDouble;private char aChar;private boolean aBoolean; }没有传键 封装时就会…

arm2 day4

汇编编写流水灯 代码&#xff1a; LED流水灯现象&#xff1a;

Aspose.OCR for .NET 2023Crack

Aspose.OCR for .NET 2023Crack 为.NET在图片上播放OCR使所有用户和程序员都可以从特定的图像片段中提取文本和相关的细节&#xff0c;如字体、设计以及书写位置。这一特定属性为OCR的性能及其在扫描遵循排列的记录时的功能提供了动力。OCR的库使用一条线甚至几条线来处理这些特…

思科C9300交换机堆叠

思科C9300交换机堆叠仅支持同质堆叠&#xff0c;即仅以Cisco Catalyst 9300系列交换机作为堆叠成员的Cisco Catalyst 930O系列交换机堆叠。需要专用电缆&#xff0c;除数据交接支持堆叠外&#xff0c;还支持电源的堆叠。 在所有交换机上运行命令 "switch convert mode sta…