后缀数组,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); ...
随机推荐
- 阿里云服务器安装Docker Compose
官网地址:https://docs.docker.com/compose/install/ 1. sudo curl -L "https://github.com/docker/compos ...
- 学习Java的第一周总结
经历了一周关于Java的学习后,我想已经初步了解了Java.在这一周中我跟随黑马程序员的脚步初步学习,现在已经安装了jdk环境(当然它不只是一个运行环境,还附带了许多开发工具)并能够用它输出" ...
- electron安装成功记录
1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...
- Diffutoon下载介绍:真人视频转动漫工具,轻松获得上千点赞
最近在刷短视频的时候,偶尔能看到一些真人转动漫风的作品,看起来给人一种新鲜感,流量都还不错,简简单单跳个舞,就能获得上千个点赞~ 那么,这种视频是怎么制作的? 本期给大家介绍一款AI转绘工具Diffu ...
- Jmeter函数助手26-logn
logn函数用于记录一条日志并返回空值. String to be logged (and returned):要打印的字符 Log level (default INFO) or OUT or ER ...
- 全球最大开源模型Grok-1 —— 马斯克的大模型
Grok官网: https://grok.x.ai/
- nvtop —— GPU使用情况的可视化工具
安装: sudo apt install nvtop
- 在Ubuntu18.04系统中源码安装 gcc7.3.0
本文给出源码安装gcc7.3.0的方法. 依赖的环境安装到自建文件夹下, 给出下面操作中环境的安装文件夹: /home/devilmaycry/anaconda3/mindspore_envs这个路径 ...
- Error occurred while running `from pyglet.gl import *`HINT: make sure you have OpenGL install. On Ubuntu, you can run 'apt-get install python-opengl'.
安装mujoco后运行可视化界面代码报错: Error occurred while running `from pyglet.gl import *`HINT: make sure you have ...
- 洛谷P1842 [USACO05NOV] 奶牛玩杂技
[USACO05NOV] 奶牛玩杂技 题目背景 Farmer John 养了 \(N\) 头牛,她们已经按 \(1\sim N\) 依次编上了号.FJ 所不知道的是,他的所有牛都梦想着从农场逃走,去参 ...