首页 > 其他分享 >OI loves Algorithm——后缀数组

OI loves Algorithm——后缀数组

时间:2024-07-10 18:43:07浏览次数:12  
标签:字符 loves Algorithm 后缀 OI Rank 拼接 数组 字典

最近 NFLS 周赛,F 题需要后缀数组,我不会,光荣掉到 20+ 名。

打完后就去补习了相关知识,觉得很巧妙,就来写了一篇专栏

1. 后缀数组的定义

后缀数组(SA)保存的是一个字符串所有后缀的排序结果,其中第 SA[i] 表示所有后缀中第 $ i $ 小的后缀的开头位置

与之相对的是名次数组 Rank,Rank[i] 表示以 $ i $ 开头的后缀排第几位

举个栗子:

str: a a a b a a b a
SA:  8 1 5 2 6 3 7 4
Rank:2 4 6 8 3 5 7 1

2. 求法

有两种方法倍增和 DC3,但我太菜了,只会倍增算法。

2.1. 倍增

倍增,就是通过 $ i $ 步的答案推出 $ 2i $ 步的答案,从而在 $ O(\log n) $ 的时间内推出答案。那它跟后缀数组有什么关系呢?

假设我们已经求出了每个 $ i \sim i + 1 $ 的子串的 Rank:

str: a a a b a a b a
Rnk2:2 2 3 4 2 3 4 1

考虑将两个字符和两个字符拼在一起成为四个字符。

实际上,我们只需要将 Rank 拼在一起即可。为什么呢?

考虑将这样的二元组进行比较:

aaab Rank: (2, 3)
aaba Rank: (2, 4)
因为 Rank 反映了字典序情况,所以比较 Rank 相当于比较字典序
First: 2 = 2 相当于比较前两个字符的字典序
Second:2 < 4 相当于比较后两个字符的字典序

回到我们刚才的例子:

Rnk2:2 2 3 4 2 3 4 1
1st: 2 2 3 4 2 3 4 1
2nd: 3 4 2 3 4 1 0 0 (没有时视为 0,是最小的序列)
Rnk4:2 3 5 7 3 4 6 1

于是我们就不断把子串拼接拼接再拼接,拼接足够多次直到长度 $ \ge n $ 即可。

使用基数排序,我们就可以 $ O(n \log n) $ 求出答案。

2.2. DC3

<++>(待更)

3. 实际应用

<++>(待更)

标签:字符,loves,Algorithm,后缀,OI,Rank,拼接,数组,字典
From: https://www.cnblogs.com/AProblemSolver/p/18294777

相关文章

  • NOIP2005 普及:第三题 采药
    辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你......
  • 【NOI】C++算法设计入门之贪心
    文章目录前言一、概念1.导入2.概念2.1贪心算法的核心思想2.2贪心算法的步骤2.3贪心算法的应用场景二、例题讲解问题:1372.活动选择问题:1456.淘淘捡西瓜问题:1551-任务调度问题:1561.买木头三、总结五、感谢前言贪心算法,如同成语"得陇望蜀"所描述的那样,总是......
  • 题解:P10732 [NOISG2019 Prelim] Palindromic FizzBuzz
    题解:P10732[NOISG2019Prelim]PalindromicFizzBuzz题意题意十分明了,给予你一个区间,判断区间中每一个数是否是回文数。思路思路比较简单,首先将每一个数按每一位放入一个数组中,顺序无论由前到后和由后到前都可以。接下来将数组折半循环,判断前后是否一样。一样的话是回文数,......
  • F. Vasilije Loves Number Theory
    原题链接题解\(a,n\)互质,所以\(d(n·a)=d(a)d(n)\),即\(n\mod\d(n)==0\)是否成立。(总是能构造出一与\(n\)互质,且\(d(a)\)任意的\(a\))由于\(n\)会很大,所以我们将\(n\)质因子分解,\(n=p_1^{m_1}p_2^{m_2}...p_k^{m_k}\)这样一来\(d(n)=(m_1+1)(m_2+1)...(m_k+1......
  • Android 11 禁用 adb root (userdebug版本)
    adbshelllogcat-sadbd/system/core/adb/daemon/services.cppunique_fddaemon_service_to_fd(std::string_viewname,atransport*transport){...#ifdefined(__ANDROID__)if(name.starts_with("framebuffer:")){returncreate......
  • Android自定义View游戏方向轮盘转向盘方向盘
    在画之前做一些规划,把View分成6份:一份就是小圆的半径,两份就是大圆的半径,大圆的圆心始终是中心,小圆位置根据手指变化,当我们手指超出大圆的范围时候就把他固定在大圆的边缘上(利用相似三角形来计算位置)。privatevoidcomputePosition(floatx,floaty){float......
  • 群辉NAS同步Android手机日历日程
    目录一、安装套件二、手机导出日历日程三、NAS套件导入日历四、获得DAVx5登陆链接五、手机配置六、验证上一篇文章我们解决了Android手机与群辉NAS的通讯录的同步,这期我们说说如何同步Android手机的日历中的日程到群辉NAS。看过上篇文章的伙伴知道,Android需要通过第......
  • POI导出案例
    /** *POI方式导出 *@paramlist数据 *@paramexportFields绑定列数组,0:表头,1:数据key *@paramresponse */ publicstaticvoidexportExcel(Listlist,String[]exportFields,HttpServletResponseresponse){ Workbookwb=newXSSFWorkbook(); /......
  • HDU 1240 Asteroids!
    题目链接:HDU1240【Asteroids!】思路    代码#include<iostream>#include<queue>#include<stdlib.h>#include<cstring>#definelllonglongusingnamespacestd;constintN=20;constintM=1e4;structpoint{intx,y,z,st......
  • 题解与求助 P2347 [NOIP1996 提高组] 砝码称重
    P2347[NOIP1996提高组]砝码称重题目描述设有$1\mathrm{g}$、$2\mathrm{g}$、$3\mathrm{g}$、$5\mathrm{g}$、$10\mathrm{g}$、$20\mathrm{g}$的砝码各若干枚(其总重$\le1000$),可以表示成多少种重量?输入格式输入方式:$a_1,a_2,a_3,a_4,a_5,a_6$(表示$1\mathrm{......