首页 > 其他分享 >SS241031D. 后缀数组(sa)

SS241031D. 后缀数组(sa)

时间:2024-11-01 12:10:03浏览次数:1  
标签:SS241031D 后缀 线段 数组 sa sim rk

SS241031D. 后缀数组(sa)

题意

重题:NOD2308D. 飒妃客厮 · 啊瑞(array)

给你一个初始 \(a_i=i\) 的长度为 \(n\) 的序列,\(n\le 10^9\)。

有 \(m\) 次操作。\(m\le 10^5\)。

  1. 把区间 \([l,r]\) 移到最前面。
  2. 翻转区间 \([l,r]\)。

最终得到序列 \(\{a_i'\}\)。

求满足长度为 \(n\) 的合法序列 \(\{b_i\}\) 的个数。一个合法的 \(b\) 满足其后缀数组是 \(a\) 且其值域连续(即最大的值等于其数字种类数)。

solution

对于 \(m\) 操作,因为有区间翻转,显然用文艺平衡树维护,可以感觉出需要使用动态开点平衡树,每个叶子维护一段区间而不是单个位置,具体维护什么信息取决于后面的推理。

假设我们已经得到了 \(\{sa_i\}\),即上文的 \(\{a_i'\}\)。

合法序列只需要满足所有的后缀 \(sa_i\) 非严格小于后缀 \(sa_{i+1}\)(虽然也不可能存在两个完全相等的后缀吧,所以其实是严格小于啦)。

对于后缀 \(sa_i,sa_{i+1}\),有两种情况:

  1. \(b_{sa_i} < b_{sa_{i+1}}\):此时 \(b_{sa_{i+1}}=b_{sa_i}+1\),否则由于所有 \(sa_{1\sim i-1}\) 的后缀都小于后缀 \(sa_i\),所有 \(sa_{i+2\sim n}\) 的后缀都大于后缀 \(sa_{i+1}\),\(b\) 的值域将不满足连续性,因为如果存在 \(b_{sa_i} < b_k < b_{sa_{i+1}}\),那么显然必定有 \(rk_{sa_i} < rk_k < rk_{sa_{i+1}}\)(定义 \(rk_{sa_i}=i\))。
  2. \(b_{sa_i} = b_{sa_{i+1}}\):此时必定要求 \(rk_{sa_i+1} < rk_{sa_{i+1}+1}\)。

想象一下我们按照 \(sa_{1\sim n}\) 的顺序填写 \(b_{sa_i}\),如果有 \(rk_{sa_i+1}<rk_{sa_{i+1}+1}\),那么 \(b_{sa_{i+1}}\) 可以填 \(b_{sa_i}\) 或者 \(b_{sa_i}+1\) 两种,否则 \(b_{sa_{i+1}}\) 必须填 \(b_{sa_i}\) 一种。

因此问题变成计数有多少满足 \(rk_{sa_i+1}<rk_{sa_{i+1}+1}\),假设有 \(cnt\) 个满足的,答案就是 \(2^{cnt}\)。

考虑如何计数。

我们的动态开点文艺平衡树维护了 \(O(m)\) 段斜率为 \(1\) 或者 \(-1\) 的线段,代表一段 \(sa\)。

在线段内部,一段上升的线段,其相邻两个 \(sa\) 一定满足要求。一段下降的线段,其相邻两个 \(sa\) 也一定满足要求。

在线段之间,一条线段末端的 \(sa\) 和后面一条线段的始端的 \(sa\) 满足要求,不好比较……

考虑把 \(sa\) 转化成 \(rk\) 数组,是好转化的,也是形如 \(O(m)\) 条上升 or 下降的线段。让刚刚那两个 \(sa\) 对应上 \(rk\) 的下标,然后直接比较 \(rk_{sa_x+1},rk_{sa_{x+1}+1}\) 就可以了,没什么技术难度。

这么看的话,题目的思维难度在于后缀数组相关要求的转化,而代码实现难度仅在于动态开点文艺平衡树上了。

时间复杂度 \(O(m\log m)\),常数应该会比较大。

好【数据删除】难写

标签:SS241031D,后缀,线段,数组,sa,sim,rk
From: https://www.cnblogs.com/liyixin0514/p/18519691

相关文章

  • POLIR-Society-Organization-Politics: “How”-政治分析的普遍适用pattern: Versatil
    总部、实控人及其关系网、资本量+流通规模总部税收记入何方“地方/中央”政权组织网络,与实际受何方政治组织调控;董事会、高管层,的国籍、常住地,资产管理方、家庭成员情况不动产:总部大厦、资金存管方:银行、信托、资产管理方资本量+流通规模资本、投资公司、金融管理......
  • 目前国内有哪些开源的非 SaaS 团队协作平台、项目管理工具吗
    国内当前一些非SaaS团队协作平台和项目管理工具主要包括:Zentao禅道、Teambition、Worktile和泡泡团队等。这些工具提供了任务管理、项目计划、文件共享、团队协作和沟通等功能,旨在提升团队工作效率。其中,Zentao禅道作为一款国内比较优秀的开源团队协作项目管理工具,其功能全面,是很......
  • LaTex - Disable equation auto numbering
     $$\Large\begin{align}W_{xr}&=\begin{cases}\begin{array}{rr}-0.0930,&0.0497,\\0.4670,&-0.5319,\end{array}\end{cases}\\W_{xz}&=\begin{cases}\begin{array}{rr}-0.6656,&0.0699,\\-0.1662,&0.0......
  • 网站修改源文件后缀,如何安全地更改网站文件的后缀名
    备份文件:在修改之前,务必备份原文件,以防万一出现问题可以恢复。了解文件类型:确保你知道文件的实际类型,例如 .html 文件和 .php 文件有不同的处理方式。重命名文件:在文件管理器中右键点击文件,选择“重命名”,然后更改文件后缀名。例如,将 index.html 改为 index.php。测试......
  • 倍增求后缀数组
    倍增求后缀数组1.一些定义后缀\(i\):子串\([\text{len}(S)-i+1,\text{len}(S)]\);\(\text{SA}(i)\):排名为\(i\)的后缀;\(\text{rank}(i)\):后缀\(i\)的排名,\(\foralli>n,\text{rank}(i)=0\)。后缀数组即\(\text{SA}\)。2.求法先对每个单独的字符从小到大排序,得到每个......
  • MFC的SendMessage与PostMessage的区别
    一、SendMessage同步操作:SendMessage是一个同步函数,它会将消息发送到指定的窗口,并等待该窗口的消息处理过程完成,然后返回。这意味着它会阻塞当前线程,直到消息处理完成。直接调用:SendMessage会将消息直接传递给目标窗口的消息处理函数,因此消息处理函数在当前线程中执行......
  • CAN Specification 2.0 PART B -- CAN message 定义(1)
    记录BOSCHCANSpecification2.0PARTBCAN协议标准学习过程,以备需要时查看;BOSCHCANSpecification2.0 文档获取:http://esd.cs.ucr.edu/webres/can20.pdfCANmessage定义1.DATAFRAME数据帧DATAFRAME由StartofFrame,ArbitrationField,ControlField,Da......
  • stm32入门教程--USART外设 超详细!!!
    目录简介什么是UART?什么是USART?简介USART(UniversalSynchron/AsynchronousReceiver/Transmitter)通用同步/异步收发器 1、USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可以自动接收RX引脚的数据帧时许,拼接......
  • 曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%
    本文整理于2024年云栖大会主题演讲《云消息队列ApsaraMQServerless演进》,杭州优行科技有限公司消息中间件负责人王智洋分享ApsaraMQforKafkaServerless助力曹操出行实现成本优化和效率提升的实践经验。曹操出行:科技驱动共享出行未来曹操出行创立于2015年5月21......
  • 如何用pbootcmsAPI接口开发微信小程序UNIAPP示例
    1.准备工作在开始开发小程序之前,你需要:搭建好PbootCMS环境,确保其正常运行。注册小程序并获取AppID和AppSecret。配置PbootCMS与小程序的接口。2.封装API//获取站点信息exportconstpostSite=(config={})=>http.post('/cms/site',config)//获取自定义标签ex......