后缀排序
后缀排序
本文做复习用,不宜初学用。
注意排序顺序
定义
操作流程
最初字符串排序
这里是桶排序基础操作。
for(int i = 1; i <= n; ++i) ++c[rk[i] = a[i]];
for(int i = 1; i <= m; ++i) c[i] += c[i - 1];
for(int i = n; i >= 1; ++i) sa[c[rk[i]--] = i;//按照1,2,3的顺序排
为什么是倒叙的呢?你用手模拟一下ababa这个样例就懂了
进行倍增比较操作。
for(int i = 1; i <= n; i <<= 1)
第二关键字排序
这里是把最后那一部分没有第二关键字的放在最前面。
num = 0;
for(int i = n - k + 1; i <= n; ++i) y[++num] = i;
对有第二关键字的排序。按照
for(int i = 1; i <= n; ++i) if(sa[i] - k > 0) y[++num] = sa[i] - k;
总体排序
清空桶。
for(int i = 1; i <= m; ++i) c[i] = 0;
这里先按照
for(int i = 1; i <= n; ++i) ++c[rk[i]];
for(int i = 1; i <= m; ++i) c[i] += c[i - 1];
for(int i = n; i >= 1; --i) sa[c[rk[y[i]--] = y[i];//按照y[i]的顺序排
更新 数组和
这里把
比较当前
swap(rk,y);num = 0;
for(int i = 1; i <= n; ++i)
rk[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && sa[i] + k <= n && sa[i - 1] + k <= n && y[sa[i] + k] == y[sa[i - 1] + k]) ? num : ++num;
if(num == n) break;
m = num; num;
LCP
定义
形式化的:
有这样的好性质:
所以要算
求 h 数组
这里很好理解。
for(int i = 1; i <= n; ++i){
h[i] = h[i - 1] - 1;
if(h[i] < 0) h[i] = 0;
while(a[sa[rk[i]] + h[i]] == a[sa[rk[i] - 1] + h[i]] ) ++h[i];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!