2023NOIP A层联测10-子序列

给定一个长为 n n n 的仅有小写英文字母构成字符串 S = S 1 S 2 ⋯ S n S=S_1S_2\cdots S_n S=S1S2Sn。我们定义一个字符串是好的,当且仅当它可以用两个不同的字母 xy 表示成 xyxyxyx... 的形式。例如,字符串 ababtotz 是好的,但字符串 abcaa 不是好的。

现在有 q q q 组询问,每次给定 1 ≤ l ≤ r ≤ n 1 \le l \le r \le n 1lrn,你想要求出,对于串 S S S 的子串 S [ l ⋯ r ] S[l \cdots r] S[lr],它最长的一个好的子序列的长度是多少,以及它可以被哪两个不同字符 xy 来表示。如果有多个最长的串,则输出字典序最小的一个串的 xy


预处理出 p r e i , j , n x t i , j pre_{i,j},nxt_{i,j} prei,j,nxti,j 分别表示第 i i i 个字符前/后第一个字符 j j j 的出现位置。

对于每个字符 S i S_i Si,考虑在只保留它时序列被分成了若干段(?????i?i??i????i?? ),预处理出 s u m i , j sum_{i,j} sumi,j 表示以 j j j 字符为分隔点,将序列分成若干段, S i S_i Si 所在的段及其之后的段含有 S i S_i Si 的个数减一。不懂?放个图就懂了。

在这里插入图片描述 可以递推求出 s u m i , j sum_{i,j} sumi,j

s u m i , j = s u m n x t i , S i + [ n x t i , S i > n x t i , j ] sum_{i,j}=sum_{nxt_{i,S_i}}+[nxt_{i,S_i}>nxt_{i,j}] sumi,j=sumnxti,Si+[nxti,Si>nxti,j]

意思就是如果 j j j 夹在 S i S_i Si 中间,就可以从后面转移过来。

对于每一次询问,枚举答案的两个字符 c 1 , c 2 c_1,c_2 c1,c2,找出区间内第一次和最后一次 c 1 c_1 c1 出现的位置 L , R L,R L,R 2 ( s u m L , c 1 − s u m R , c 1 ) + 1 + [ p r e r + 1 , c 2 > R ] 2(sum_{L,c_1}-sum_{R,c_1})+1+[pre_{r+1,c_2}>R] 2(sumL,c1sumR,c1)+1+[prer+1,c2>R] 就是最长的好子序列长度。这样就求出了答案。

具体实现看代码

#include<bits/stdc++.h>
using namespace std;
const int N=1.5e6+2;
char a[N];
int m,pre[N][26],nxt[N][26],sum[N][26];
int main()
{freopen("seq.in","r",stdin);freopen("seq.out","w",stdout);scanf("%s",a+1);int n=strlen(a+1);for(int i=1;i<=n+1;i++){for(int j=0;j<26;j++){if(a[i-1]==j+97) pre[i][j]=i-1;else pre[i][j]=pre[i-1][j];}}for(int i=0;i<26;i++) nxt[n+1][i]=n+1;for(int i=n;i>=0;i--){for(int j=0;j<26;j++){if(a[i+1]==j+97) nxt[i][j]=i+1;else nxt[i][j]=nxt[i+1][j];}for(int j=0;j<26;j++){sum[i][j]=sum[nxt[i][a[i]-97]][j]+(nxt[i][a[i]-97]>nxt[i][j]);}}scanf("%d",&m);for(int i=1,l,r;i<=m;i++){scanf("%d%d",&l,&r);int maxn=-1;char c1=0,c2=0;for(int i=0;i<26;i++){for(int j=0;j<26;j++){if(i==j) continue;if(nxt[l-1][i]>r) continue;int L=nxt[l-1][i],R=pre[r+1][i];int ans=(sum[L][j]-sum[R][j])*2+1+(pre[r+1][j]>R);if(ans>maxn) maxn=ans,c1=i+97,c2=j+97;}}printf("%d %c%c\n",maxn,c1,c2);}
}

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

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

相关文章

【Java 进阶篇】JavaScript三元运算符详解

JavaScript是一门广泛用于前端和后端开发的编程语言&#xff0c;具备强大的表达式和运算符。本篇博客将重点介绍JavaScript中的三元运算符&#xff0c;解释其语法、用法和示例。如果您是JavaScript初学者&#xff0c;或者希望更深入了解这门语言的运算符&#xff0c;那么这篇博…

java Maven入门笔记

后端Web开发技术的学习&#xff0c;我们要先学习Java项目的构建工具&#xff1a;Maven 目录 Maven概述Maven介绍及其作用Maven模型介绍Maven仓库Maven安装 IDEA集成Maven配置Maven环境当前工程设置全局设置 Maven项目创建Maven项目POM配置详解Maven坐标详解 导入Maven项目 依赖…

数据结构 第3章作业 栈和队列 西安石油大学

第3章 栈和队列 有5个元素&#xff0c;其入栈次序为&#xff1a;A,B,C,D,E&#xff0c;在各种可能的出栈次序中&#xff0c;以元素C、D最先出栈&#xff08;即C第一个且D第二个出栈)的次序有哪几个? 3个&#xff1a;CDEBA&#xff1b;CDBEA&#xff1b;CDBAE 此题考查的知识…

小谈设计模式(26)—中介者模式

小谈设计模式&#xff08;26&#xff09;—中介者模式 专栏介绍专栏地址专栏介绍 中介者模式分析角色分析抽象中介者&#xff08;Mediator&#xff09;具体中介者&#xff08;ConcreteMediator&#xff09;抽象同事类&#xff08;Colleague&#xff09;具体同事类&#xff08;C…

计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(matlab代码)

目录 1 主要内容 系统结构 CCPP-P2G-燃气机组子系统 非线性处理缺陷 2 部分代码 3 程序结果 4 程序链接 1 主要内容 该程序参考《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》模型&#xff0c;主要实现的是计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度…

servlet基础知识

目录 什么是servlet概念/定义作用 servlet容器概念/是什么作用如何配置和管理 servlet生命周期有哪些生命周期每个周期中可以执行哪些操作 创建和编写servlet如何创建一个简单的servletservlet类的结构是什么样的如何处理HTTP请求和响应 servlet映射和URL模式什么是servlet映射…

黄金票据与白银票据

文章目录 黄金票据与白银票据1. 背景2. 具体实现2.1 Kerberos协议认证流程 3. 黄金票据3.1 条件3.2 适用场景3.3 利用方式 4. 白银票据4.1 条件4.2 适用场景4.3 利用方式 5. 金票和银票的区别5.1 获取的权限不同5.2 认证流程不同5.3 加密方式不同 6. 经典面试题6.1 什么是黄金票…

github小记(一):清除github在add或者commit之后缓存区

github清除在add或者commit之后缓存区 前言1. 第一步之后想要撤销2. 第二步之后想要撤销a. 改变一下rrr.txt的内容b. 想提交本地文件的test文件夹c. 我后悔了突然不想提交了 前言 github自用 一般github上代码提交顺序&#xff1a; 第一步&#xff1a; git add . or git ad…

数据库Mysql三大引擎(InnoDB、MyISAM、 Memory)与逻辑架构

MySQL数据库及其分支版本主要的存储引擎有InnoDB、MyISAM、 Memory等。简单地理解&#xff0c;存储引擎就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特色&#xff0c;使用的是一个可插拔存储引擎架构&#xff0c;能够在运行的时候动态加载或者卸载这些存…

软件设计师学习笔记12-数据库的基本概念+数据库的设计过程+概念设计+逻辑设计

1.数据库的基本概念 1.1数据库的体系结构 1.1.1常见数据库 ①集中式数据库 数据是集中的&#xff1b;数据管理是集中的 ②C/S结构 客户端负责数据表服务&#xff1b;服务器负责数据库服务&#xff1b;系统分前后端&#xff1b;ODBC、JDBC ③分布式数据库 物理上分布、逻…

three.js学习之vR展厅

目标 1、需要会的知识点three.js的场景&#xff0c;摄像机&#xff0c;渲染器&#xff0c;轨道控制器&#xff0c;坐标轴&#xff0c;场景适配&#xff0c;渲染循环创建立方缓冲几何体、纹理、3d物体 实现&#xff1a;创建立方几何体&#xff0c;纹理贴图镜面反向渲染&#xf…

Flutter配置Android SDK路径

在使用VSCode作为开发Flutter的工具时&#xff0c;当选择调试设备时&#xff0c;通常看不到android的模拟器&#xff0c;只能看到Chrome之类的。 原因就是Flutter找不到Android的SDK路径&#xff0c;所以无法识别模拟器&#xff0c;我们用flutter doctor命令检查环境时&#xf…