首页 > 其他分享 >P4143 采集矿石 题解

P4143 采集矿石 题解

时间:2023-12-02 19:33:45浏览次数:61  
标签:子串 后缀 题解 位置 矿石 str text 排名 P4143

题目传送门

  • 给出字符串 \(s\),以及数组 \(a_1\sim a_{|s|}\)。

  • 定义一个子串的排名为:字典序比它大的本质不同的子串个数 \(+1\)。

  • 定义一个子串 \(s[l,r]\) 的权值为 \(\sum\limits_{i=l}^ra_i\)。

  • 求有多少个子串的排名等于权值。

  • \(|s|\le 10^5,0\le a_i\le 1000\)。

首先对 \(s\) 进行后缀排序,然后考虑每一个左端点 \(l\),不难发现随着右端点 \(r\) 的增大,子串的排名单调递减,权值单调不降。

所以可以二分出满足条件的最小 / 大右端点。

考虑如何求出一个子串 \(t\) 的排名。可以用本质不同子串数减去比它小的。

前半部分运用经典结论即为 \(\sum\limits_{i=1}^n (|s|-sa_i+1-\text{height}_i)\),我们考虑如何求比它小的本质不同子串数。

可以二分出以这个子串为前缀的后缀排名区间 \([L,R]\)。答案即为排名为 \(\boldsymbol{[1,L)}\) 的后缀带来的本质不同子串个数。

  • 充分性:

    若一个子串 \(str\) 在排名为 \([1,L)\) 的后缀中作为前缀出现,那么这个后缀 \(s[i,|s|]\) 与 \(s[l,|s|]\) 的 \(\text{LCP}\) 长度一定小于 \(\boldsymbol{|t|}\)。即两个后缀可以在第 \(|t|\) 个位置之前可以找到不相同的位置。而由于 \(s[i,|s|]\) 这个后缀排名更小,在这个位置一定 \(s[i,|s|]\) 这个后缀小于 \(s[l,|s|]\)。

    考虑 \(str\) 是否跨过这个位置,若不是,则在前 \(|str|\) 位两串相同,第 \(|str|+1\) 位 \(str\) 为空,字典序极小。

    若跨过,则 \(str\) 在这个位置小于 \(t\)。

  • 必要性:

    考虑这两个子串第一次不同是在某个位置,这个位置一定在两个后缀中。

正确性证好了。这个东西也是考虑每个后缀带来的本质不同子串。即可以这么求:

\[\sum\limits_{i=1}^{L-1}(|s|-sa_i+1-\text{height}_i) \]

于是做完了。时间复杂度为 \(\mathcal{O}(|s|\log^2|s|)\),空间复杂度为 \(\mathcal{O}(|s|)\)。

提交记录 代码

标签:子串,后缀,题解,位置,矿石,str,text,排名,P4143
From: https://www.cnblogs.com/MnZnOIerLzy/p/17872098.html

相关文章

  • java: 未报告的异常错误java.io.UnsupportedEncodingException; 必须对其进行捕获或声
    原问题代码:/**MD5编码相关的类@authorwangjingtao*/publicclassMD5{//首先初始化一个字符数组,用来存放每个16进制字符privatestaticfinalchar[]hexDigits={'0','1','2','3','4','5','6','7'......
  • CF1790F题解
    思路令$dis_i$为离$i$最近的黑点距离,$ans$是距离最近的一对黑点距离,我们可以发现,每次$i\getsi+1$后$ans$的更新只会与$dis_{c_i}$有关,因为$c_i$是新的黑点,然后再从$c_i$来一次BFS更新$dis_i$即可。更详细的在注释。代码#include<bits/stdc++.h>......
  • [题解]AT_abc224_e [ABC224E] Integers on Grid
    比较符合CCF造数据水平的题。思路首先可以用两个vector<pair<int,int>>v[N]分别将每一行、每一列的元素的权值与编号存储下来。那么可以对所有的\(v_i\)按照权值从小到大排序。那么发现对于所有的满足v[i][p].fst<v[i][q].fst的\((p,q)\)都可以建一条从\(p\)指......
  • CSP第31次认证题解 2023.9
    A、坐标变换(其一)样例输入3210100010-201-100样例输出21-1120-10题解按照题目,一个循环即可#include<bits/stdc++.h>usingnamespacestd;#defineN200010#definelllonglongtemplate<classT>inlinevoidread(T&a){Tx=0,s=1;......
  • 使用Navicat For MSSQL连接绿色版SQLServer2008R2问题解决
    问题1、创建连接时出现错误:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)Navicat来连接SQLserver,这里确实有点麻烦,出现错误[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0),解决方法:进入Navicat的安装......
  • CF1368题解
    CF1368CodeforcesGlobalRound8ABC略。CF1368DlinkCF1368D题意给定\(n\)个非负整数\(a_1,\cdots,a_n\)。你可以进行如下操作:选择两个不同的下标\(i,j\)满足\(1\leqi,j\leqn\),并将\(a_i\getsa_i\\mathsf{AND}\a_j,\a_j\getsa_i\\mathsf{OR}\a_j\),两个赋值......
  • newstarctf2023 reverse 题解汇总
    newstarctf2023reverse题解汇总week1easy_REdie查无壳64直接IDA启动跟到main函数找到两部分flag拼起来就行了。flag{we1c0me_to_rev3rse!!}ELFdie查64ELFIDA启动稍微读一下写个py逆一下它的加密就行了flag{D0_4ou_7now_wha7_ELF_1s?}importbase64a="VlxRV......
  • ISCTFpwn的ezpie题解
    目前接触的随机好像都与地址有关,而且还有一个特性也就是只是基址随机,只要有任意一个地址就可以知道其他所有具体地址。(libc和pie保护)这里将通过ezpie这道题介绍绕过pie的一种方式,泄露地址一获取全部地址的方法。本人还不太懂partiallywrite的原理,就不误人子弟了。这里我们看到v5......
  • 【POJ 1144】Network 题解(Tarjan算法求无向图的割点)
    一家电话线公司(TLC)正在建立一个新的电话电缆网络。它们连接由1到N的整数编号的几个位置。没有两个地方的数字相同。这些线路是双向的,总是连接在两个地方,在每一个地方,线路都以电话交换机结束。每个地方都有一个电话交换机。从每个地方可以通过其他地方的线路到达,但不需要直接连接,可......
  • P9879 题解
    blog。找网络流水题写题解/hsh。间隔染色(\(i+j\)分奇偶染不同色)后,所有\(i+j\)为奇数的格子反色,题目的Pattern等价于是\(2\times2\)的全黑或全白格子。然后很自然地想Flow了。每个点分黑白两种状态。如果\((x,y)\)对应的Pattern有机会染成全黑,就连边\(S\xright......