后缀数组,SA
主要是 \(O(n\log n)\) 倍增求 SA。
(为什么这么短)
const int N = 1e6 + 9;
int n;
int sa[N], sa_tmp[N], rk[N], ork[N], buc[N], ht[N];
char s[N];
void getSA() {
int m = 127;
rep (i, 1, n) ++buc[rk[i] = s[i]];
rep (i, 1, m) buc[i] += buc[i - 1];
per (i, n, 1) sa[buc[rk[i]]--] = i;
for (int len = 1, p = 0; ; m = p, p = 0, len *= 2) {
rep (i, n - len + 1, n) sa_tmp[++p] = i;
// 这里不用判断吗
rep (i, 1, n) if (sa[i] > len) sa_tmp[++p] = sa[i] - len;
memset(buc, 0, sizeof(buc[0]) * (m + 1));
rep (i, 1, n) ++buc[rk[i]];
rep (i, 1, m) buc[i] += buc[i - 1];
per (i, n, 1) {
int x = sa_tmp[i];
sa[buc[rk[x]]--] = x;
}
rep (i, 1, n) ork[i] = rk[i];
p = 0;
rep (i, 1, n) rk[sa[i]] = (ork[sa[i - 1]] == ork[sa[i]] && ork[sa[i - 1] + len] == ork[sa[i] + len]) ? p : ++p;
if (p == n) break;
}
int j = 0;
rep (i, 1, n - 1) {
if (j) --j;
while (s[i + j] == s[sa[rk[i] - 1] + j]) ++j;
ht[rk[i]] = j;
}
}
后缀数组,SA的更多相关文章
- 后缀数组(SA)总结
后缀数组(SA)总结 这个东西鸽了好久了,今天补一下 概念 后缀数组\(SA\)是什么东西? 它是记录一个字符串每个后缀的字典序的数组 \(sa[i]\):表示排名为\(i\)的后缀是哪一个. \(r ...
- 后缀数组SA学习笔记
什么是后缀数组 后缀数组\(sa[i]\)表示字符串中字典序排名为\(i\)的后缀位置 \(rk[i]\)表示字符串中第\(i\)个后缀的字典序排名 举个例子: ababa a b a b a rk: ...
- 后缀数组SA入门(史上最晦涩难懂的讲解)
参考资料:victorique的博客(有一点锅无伤大雅,记得看评论区),$wzz$ 课件(快去$ftp$%%%),$oi-wiki$以及某个人的帮助(万分感谢!) 首先还是要说一句:我不知道为什么我这 ...
- bzoj3796(后缀数组)(SA四连)
bzoj3796Mushroom追妹纸 题目描述 Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决定不手写情书.他从 ...
- [笔记]后缀数组SA
参考资料这次是真抄的: 1.后缀数组详解 2.后缀数组-学习笔记 3.后缀数组--处理字符串的有力工具 定义 \(SA\)排名为\(i\)的后缀的位置 \(rk\)位置为\(i\)的后缀的排名 \(t ...
- 【字符串】后缀数组SA
后缀数组 概念 实际上就是将一个字符串的所有后缀按照字典序排序 得到了两个数组 \(sa[i]\) 和 \(rk[i]\),其中 \(sa[i]\) 表示排名为 i 的后缀,\(rk[i]\) 表示后 ...
- 浅谈后缀数组SA
这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...
- 后缀数组SA
复杂度:O(nlogn) 注:从0到n-1 const int maxn=1e5; char s[maxn]; int sa[maxn],Rank[maxn],height[maxn],rmq[max ...
- 洛谷2408不同字串个数/SPOJ 694/705 (后缀数组SA)
真是一个三倍经验好题啊. 我们来观察这个题目,首先如果直接整体计算,怕是不太好计算. 首先,我们可以将每个子串都看成一个后缀的的前缀.那我们就可以考虑一个一个后缀来计算了. 为了方便起见,我们选择按照 ...
- 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)
补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...
随机推荐
- .NET开源、简单、实用的数据库文档生成工具
前言 今天大姚给大家分享一款.NET开源(MIT License).免费.简单.实用的数据库文档(字典)生成工具,该工具支持CHM.Word.Excel.PDF.Html.XML.Markdown等多 ...
- Django 文件导入实现方案
Django文件导入实现方案 by:授客 QQ:1033553122 开发环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: https ...
- manim边学边做--Table
表格是一种常见的数据展示形式,manim提供了Table模块专门用于显示表格形式的数据.表格Table和上一节介绍的矩阵Matrix都是用来显示二维数据的,不过,Table的表现力更强,比如,它可以显 ...
- php环境-2024年3月19日
laravel 6[laravel的orm比其他框架的好用,可以写很少的代码就能完成] php 7.4 mysql 5.7 centos7 redis jwt 队列(laravel的redis队列,或 ...
- .NET 高性能缓冲队列实现 BufferQueue
目录 前言 适用场景 功能说明 使用示例 BufferQueue 内部设计概述 Topic 的隔离 Partition 的设计 对并发的支持 Partition 的动态扩容 Segment 的回收机制 ...
- python raise异常处理
python raise异常处理 一般最简单的异常处理是try except: try: f = open('test.txt') except Exception as e: print(e) f ...
- 【微信小程序】 分包
1. 什么是分包 分包指的是把一-个完整的小程序项目,按照需求划分为不同的子包, 在构建时打包成不同的分包,用户在使用时按需进行加载. 2. 分包的好处 对小程序进行分包的好处主要有以下两点: ● 可 ...
- 【C3】06 选择器概述
CSS中,选择器用来指定网页上我们想要样式化的HTML元素. CSS选择器有很多种可供使用,所以在选择要样式化的元素时,我们可以做到很精细的地步. 本文和本文的子篇中,我们将会很详细地讲授选择器不同的 ...
- 树莓派3b+ ubuntu mate18.04系统下的kodi软件 实现airplay投屏
1. 更新资源 sudo apt-get update 2. 安装kodi sudo apt-get install kodi 安装成功后系统菜单中的音影一栏中有kodi 这一项,进入kod ...
- 简单设计一个JAVA并行处理工具类
在工作中,我们肯定遇到过一个接口要处理N多事项导致接口响应速度很慢的情况,通常我们会综合使用两种方式来提升接口响应速度 优化查询SQL,提升查询效率 开启多线程并发处理业务数据 这里讨论第二种方案:使 ...