首页 > 其他分享 >UVA10829 L-Gap Substrings

UVA10829 L-Gap Substrings

时间:2024-03-17 10:56:14浏览次数:22  
标签:pre le text mn mid Gap Substrings sa UVA10829

我永远喜欢数据结构。

貌似是此题中第一个使用 SA + 分治 + 二维数点做法的题解?

题目传送门

  • 给出字符串 \(s\) 和常数 \(g\),求出有多少四元组 \((l_1,r_1,l_2,r_2)\),满足 \(s[l_1,r_1]=s[l_2,r_2]\) 且 \(r_1+g+1=l_2\)。

  • \(T\) 组数据,\(1\le T,g\le 10\),\(|s|\le 5\times 10^4\)。

不知道 \(1\le g\le10\) 有啥用。

先后缀排序。

考虑一对合法的 \(s[l_1,r_1]\) 和 \(s[l_2,r_2]\) 来自分别哪个后缀。假设它们分别来自排名为 \(i\) 和 \(j\) 的后缀(显然 \(\text{sa}_i=l_1,\text{sa}_j=l_2\))。令 \(u=\min\{i,j\},v=\max\{i,j\}\),此时 \(u<v\)。则一定满足,\(|\text{LCP}(s[\text{sa}_u,|s|],s[\text{sa}_v,|s|])|\ge |\text{sa}_u-\text{sa}_v|-g\)。因为它们已经有了 \(r_1-l_1+1\) 这个长度的最长公共前缀。这种情况下我们称 \((l_1,r_1,l_2,r_2)\) 这个四元组与 \((u,v)\) 这个二元组对应。对于同一对 \((l_1,r_1,l_2,r_2)\),由于 \(l_1,l_2\) 都是确定的,所以它只会与唯一一对 \((u,v)\) 对应。

我们再考虑对于一个 \((u,v)(u<v)\) 的二元组,若满足 \(|\text{LCP}(s[\text{sa}_u,|s|],s[\text{sa}_v,|s|])|\ge |\text{sa}_u-\text{sa}_v|-g\),此时令 \(i=\min\{\text{sa}_u,\text{sa}_v\},j=\max\{\text{sa}_u,\text{sa}_v\}\),则 \((i,j-k-1,j,2j-k-i-1)\) 一定是一个合法的四元组。我们让它们对应。则一个对于二元组 \((u,v)\),它们已经确定了两个串的起点,则终点也随之确定了,所以对应了唯一一个合法的四元组。

我们发现合法的二元组与合法的四元组一一对应。

那么只需要统计有多少满足条件的 \((u,v)(u<v)\),任意一个合法的四元组都会在与之对应的二元组处被统计一次后就不再统计,且任意一个合法的二元组统计的都是与之对应的一个合法的四元组,做到了不多、不重、不漏。

考虑转化成 \(\text{height}\) 数组的限制,则要统计满足一下条件的 \((u,v)\) 个数:

\[\begin{cases}u<v\\|\text{sa}_u-\text{sa}_v|-g\le \min\limits_{i=u+1}^v\text{height}_i\end{cases} \]

套路地分治,设当且分治区间为 \([l,r]\),中点 \(\text{mid}=\left\lfloor\dfrac{l+r}{2}\right\rfloor\)。考虑统计跨过 \(\text{mid}\) 的贡献。考虑固定 \(u\)。

从 \(\text{mid}\rightarrow l\) 扫描 \(u\),处理 \(\text{mn}=\min\limits_{i=u+1}^{\text{mid}}\text{height}_i\),设 \(\text{pre}_v=\min\limits_{j=\text {mid}+1}^v \text{height}_j\),钦定 \(\text{pre}_{r+1}\) 极小。此时 \(\text{pre}\) 是不升的。则一定存在一个 \(p\in[\text{mid+1},r+1]\) 使得 \(\text{pre}_p<\text{mn}\)。这种情况下,当 \(v\in[\text{mid}+1,p)\) 时 \(\min\limits_{i=u+1}^v\text{height}_i=\text{mn}\);当 \(v\in[p,r]\) 时 \(\min\limits_{i=u+1}^v\text{height}_i=\text{pre}_v\)。

对于 \(v\in[\text{mid}+1,p)\) 的部分,就是要统计有多少 \(v\) 满足 \(|\text{sa}_u-\text{sa}_v|-g\le \text{mn}\)。拆绝对值后二维数点即可。

对于 \(v\in[p,r]\) 的部分,就是要统计有多少 \(v\) 满足 \(|\text{sa}_u-\text{sa}_v|-g\le \text{pre}_v\)。同样拆绝对值,但是你发现此时变成三维数点,不能接受。

考虑一个智慧的容斥,对于 \(v\in[p,r]\) 的部分,先统计有多少 \(v\) 满足 \(|\text{sa}_u-\text{sa}_v|-g\le \text{mn}\),然后对于 \(\text{pre}_j<|\text{sa}_u-\text{sa}_v|-g\le \text{mn}\) 的 \(v\) 减去它们的贡献。

由于对于 \(v\in[\text{mid}+1,p)\) 的部分 \(\text{pre}_j\ge \text{mn}\),所以我们只需要减去全局 \(\text{pre}_j<|\text{sa}_u-\text{sa}_v|-g\le \text{mn}\) 的 \(v\) 的贡献。这样少了一个 \(v\) 的限制,拆绝对值后仍是二维数点,离线 + BIT 解决。

此时,两部分 \(|\text{sa}_u-\text{sa}_v|-g\le \text{mn}\) 的贡献都要计算,于是全局维护一个 \(\text{sa}_v\) 的值域 BIT 即可。

注意这里拆绝对值和解不等式的细节,尤其是不能忽略 \(\text{sa}_v\in[1,|s|]\) 的这个先天限制。

然后往两半递归求解即可。

这题就做完了,时间复杂度为 \(\mathcal{O}\left(|s|\log^2|s|\right)\),空间复杂度为 \(\mathcal{O}(|s|)\)。代码不算很难写。

AC Link

AC Code

标签:pre,le,text,mn,mid,Gap,Substrings,sa,UVA10829
From: https://www.cnblogs.com/MnZnOIerLzy/p/18078257

相关文章

  • Go 100 mistakes - #41: Substrings and memory leaks
        WeneedtokeeptwothingsinmindwhileusingthesubstringoperationinGo. First,theintervalprovidedisbasedonthenumberofbytes,notthenumberofrunes. Second,asubstringoperationmayleadtoamemoryleakastheresultings......
  • Oracle DataGuard 出现 GAP 修复
    下面我们通过实验来进行演示如何修复:一、主库切几个最新的归档,然后手工删掉,重新开启DG同步。1、备库关闭应用日志和数据库SQL>ALTERDATABASERECOVERMANAGEDSTANDBYDATABASECANCEL;Databasealtered.SQL>shutdownimmediateDatabaseclosed.Databasedismounted.OR......
  • CF316G3 Good Substrings
    题意简述有一个字符串\(s\)和\(n\)条限制,每条限制给出字符串\(t_i\)和两个整数\(l_i,r_i\),要求一个字符串要满足在\(t_i\)中的出现次数要在\([l_i,r_i]\)之间。求\(s\)有多少本质不同的子串满足所有限制。\(|s|,\max|t|\le5\times10^4,n\le10\)分析“本质不同......
  • ABC240Ex Sequence of Substrings
    题意简述有长度为\(n\)的01串,你现在要选出\(k\)个两两无交子串,使得将\(k\)个子串按照出现位置排序后,后者的字典序严格比前者大。最大化\(k\)。\(\bm{n\le2\times10^4}\)。分析首先的首先观察数据范围可知此题应该是个线性根号对数的时间复杂度首先有个显然的\(O(n......
  • CodeCraft-22 and Codeforces Round 795 (Div. 2)C. Sum of Substrings(分类讨论、贪
    感觉分类讨论的能有点弱。遇到复杂一点的分类讨论的题目,代码就写的巨长。首先观察到处在中间位置的1对答案的贡献是11,具体在中间哪个位置是没有关系的。只有两端的两个位置是比较特殊的\(1位置处的1对答案的贡献是10\)\(2位置处的1对答案的贡献是1\)所有我们考虑将最左端第一......
  • CPLEX通过Python API获取Gap值的方法
    写在前面最近在使用Cplex求解模型,尽管Cplex的PythonAPI会自动输出引擎日志,但在多次求解中一次次看引擎日志找Gap值并做实验记录很麻烦,所以需要找到获取Gap值的方法。然而我在Cplex的官方文档中并没有找到这个方法,然后我就一个个去试这些方法,可算是给我试出来了。解决方法在Cpl......
  • Spring Boot原理分析 | SpringApplication、Yaml、Properties
    ......
  • Count Beautiful Substrings II
    CountBeautifulSubstringsIIYouaregivenastring s andapositiveinteger k.Let vowels and consonants bethenumberofvowelsandconsonantsinastring.Astringis beautiful if:vowels==consonants.(vowels*consonants)%k==0,inothert......
  • MindtheGap队伍实录(till 2023Nov)
    正式比赛\(**Year2023**\)\(ICPCNanjing:steel\)\(CCPCShenzhen:bronze\)\(ICPCJinan:\)未开始\(ICPCHangzhou(*):\)未开始交题圣经"语言别交错题目别交ß错longlong有没有开空间够不够大小够不够自己的样例试过没格式'\n'有没有板子有没有写错有没有取题目要求......
  • springboot学习之——SpringApplication.run方法
    springboot学习之——SpringApplication.run方法目录springboot学习之——SpringApplication.run方法第一步第二步ConfigurableApplicationContextspringboot版本3.1.5第一步 /** *Statichelperthatcanbeusedtoruna{@linkSpringApplication}fromthe *spe......