首页 > 编程语言 >01.23 算法补全:后缀数组

01.23 算法补全:后缀数组

时间:2024-01-23 17:23:10浏览次数:23  
标签:子串 补全 后缀 01.23 数组 2n 排序 rk

秉着技多不压身的想法,我认为在有些时候后缀数组的直接建法还是有用处的,于是决定快速地补一下这个算法。

以后看看能不能每天稳定产出一篇,随便什么的文章。可能是一个 trick 的记录,也能是算法补全,或者是题解慢报/速报,亦或是鲜花。这些内容会同步发表于我的洛谷 blog:https://www.luogu.com.cn/blog/forever-captain/,标签为【高二 OIer 精神状况记录】

1. 后缀数组的构建

考虑如下排序方法:我们从 \(h=0\to \lceil\log_2n\rceil\),对于每个 长 \(2^h\) 的子串(末尾用 \(0\) 补齐)进行离散化操作。

这个是容易的。我们得到了长 \(2^h\) 的子串的排名 \(f(S)\) 后,设一个长 \(2^{h+1}\) 的子串由长 \(2^h\) 的子串 \(A\) 与 \(B\) 拼接而成,那么令这个子串的权值为二元组 \((f(A),f(B))\) 即可。这个二元组的排序可以使用基数排序:先按第二关键词排,再按第一关键词排。

实现:https://loj.ac/s/1985591

然后考虑一个非常简单的问题:求任意两个后缀的 LCP。考虑设如下两个数组:\(rk_i\) 表示后缀 \(i\) 的排名,\(h_i\) 表示 \(\operatorname{LCP}(sa_{i-1},sa_{i})\)。于是两个后缀 \(x,y\) 的 LCP 即 \(h[x+1,y]\) 的最小值。

令 \(a_i=h_{rk_i}\)(即位置为 \(i\) 的后缀的 \(h\) 值),于是有性质 \(a_i\ge a_{i-1}+1\)。这个性质是很直观的,不再作证明。于是可以直接求 \(h\) 了。

2. 树上后缀排序

后缀平衡树能直接做。不多赘述这个比较无脑的做法。

后缀数组做法:考虑修改一下序列的后缀排序,让其上树。倍增可以直接改成树上倍增,其实就好了。

但是考虑到树上可能会存在两个串相同的情况,这个是容易的,先做一次后缀排序之后,再判断相同即可。注意判断相同需要对于离散化值相同的还需判深度相同。

3. 【例】NOI2023 字符串

这题主要应用 rk 数组。rk 数组在子串比较中是有很大的用处的。

考虑把串反过来接到原串后面形成 \(S'\),那么题目的限制变为 \(S'[i,i+l-1]\) 比 \(S'[2n-i-2l+2,2n-i-l+1]\) 小。对于特殊性质 B,这个等价于后缀 \(i\) 小于后缀 \(2n-i-2l+2\)。直接对 rk 数组分奇偶二维数点即可。对于有相邻的相同的情况,可以发现我们多算了满足,以 \((i+l-1,i+l)\) 为回文中心且覆盖到 \(i\) 且后缀 \(i-1\) 小于后缀 \(2n-i+1\) 的情况。考虑 Manacher 跑出回文后,同样是一个二维数点问题。所以总复杂度 \(O(n\log n)\)。

注意:多次 Manacher 一定要把辅助串清得干干净净。

实现:https://uoj.ac/submission/674818

标签:子串,补全,后缀,01.23,数组,2n,排序,rk
From: https://www.cnblogs.com/TetrisCandy/p/17982948

相关文章

  • 【2024.01.23】搭建幻兽帕鲁palworld私人服务器,并配置难度
    使用docker进行部署无疑是最快的项目地址:https://github.com/thijsvanloef/palworld-server-docker代码内容services:palworld:image:thijsvanloef/palworld-server-docker:latestrestart:unless-stoppedcontainer_name:palworld-serverpo......
  • BZOJ1717 Milk Patterns 产奶的模式 (二分+后缀数组+height数组)
    发现这样起标题更能引流(ylg实锤了)题意给定一个长度为\(n\)的数组\(a\),求在\(a\)中出现了至少\(k\)次的最长子串的长度。解法考虑将一个子串拆成两个后缀,即\([l,r]=[l,n]-[r,n]\),发现一个长度为\(x\)的子串\(t\)在\(i,j\)两个位置出现过当且仅当后缀\(i,j\)有......
  • (6)Powershell中命令自动补全功能及使用Windows命令
    (6)Powershell中命令自动补全功能及使用Windows命令上一节主要介绍了Powershell中常见的别名,以及怎么通过别名查看真实的Powershell命令,Powershell别名的命名规范以及如何新建自己的别名(Powershell内置别名不可更改)以及Powershell中兼容性别名,详细内容怼介里。在本节主要包含......
  • 【学习笔记】后缀自动机 SAM
    一.后缀自动机的定义SAM(SuffixAutomaton)是一种有限状态自动机,仅可以接受一个字符串的所有后缀。如果您不懂自动机,那么换句话说:SAM是一个有向无环图。称每个结点为状态,边为状态间的转移,每个转移标有一个字母,同一节点引出的转移不同。SAM存在一个源点\(S\),称为初始状态......
  • ES--自动补全查询
    elasticsearch提供了CompletionSuggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:参与补全查询的字段必须是completion类型。字段的内容一般是用来补全的多个词条形成的数组。比......
  • AI 图像自动补全 Uncrop 工具介绍
    ClipDropUncrop是一款基于AI的图像自动补全工具,由StabilityAI旗下的Clipdrop开发。通过利用StableDiffusionXL开发的算法和深度学习技术,Uncrop可以对用户上传的图片进行自动扩展和补全,改变图片尺寸,使得图像内容得到更完整的呈现。用户只需要上传需要补全的图片,选择想要的尺寸,Un......
  • 后缀数组 SA 学习笔记
    后缀数组SA学习笔记后缀数组处理字符串后缀排名,公共子串类问题十分优秀,可以在部分情况下替代后缀自动机(SAM),本文主要讲解后缀数组的实现过程和部分例题。正文定义后缀:从\(i\)开始到字符串结束的一个特殊子串,本文用\(suf(i)\)表示从\(i\)开始的后缀。后缀数组SA:SA是......
  • 超级简单的后缀数组(SA)笔记!!
    超级简单的后缀数组(SA)!!(未完)前言这里选择当一手标题党。由于刚学完这个字符串算法,本人字符串算法又比较薄弱,好不容易这一次在晚修看各种资料看得七七八八,决定趁脑子清醒的时候记录下来。免得自己不久后忘了后又要痛苦地再看各种资料。希望这篇博客能帮到你。前置知识:RMQ问题......
  • 文件显示.[[email protected]].2700的后缀,中勒索病毒了
    勒索病毒是一种新型电脑病毒,主要通过邮件、程序木马、网页挂马等形式进行传播。一旦感染,它会利用各种加密算法对文件进行加密,被感染者一般无法解密,必须拿到解密的私钥才有可能破解。该病毒会修改壁纸,在桌面等明显位置生成勒索提示文件,指导用户去缴纳赎金。攻击的样本以exe、js、wsf......
  • 自动补全、搜索建议
    作为系统的使用者,我希望用户输入搜索的过程中,系统能进行自动补全和搜索建议,协助用户输入更精准的关键词,提高后续全文搜索阶段文档匹配的准确度。实现方案用户刚开始输入的过程中,使用CompletionSuggester进行关键词前缀匹配,刚开始匹配项会比较多,随着用户输入字符增多,匹配项越来......