后缀数组学习笔记
前言
事实上是瞎写的,给自己复习用的,不建议阅览此篇
后缀排序
两个数组\(sa[N]\)和\(rk[N]\),主要思想是倍增,然后用基数排序减少一个\(log\).
\(O(n)\)其实没太大用。
应用:
1.模式串匹配,\(sa\)套个二分,复杂度\(O(nlog_2n)\),感觉比较鸡肋。
2.查字典序。
height
求出来上面个其实没什么很多应用,
本质是加速\(height\)的计算,后缀数组主要也是用\(height\).
引理:
\[heiht[rk[i-1]]-1 \leq height[rk[i]]
\]
画图方便理解。
就可以\(O(n)\)求\(height\)了
\(lcp\)表示两个串最长公共前缀,因为后缀是排好序的,所以很显然:
\[LCP(sa[i],sa[j])=min \{ height[x] \} (i < x \leq j )
\]
就可以把很多字符串问题转化成区间上的问题,用一些数据结构维护。
套路
大概就是:
\(1.\)奇怪字符连接多个字符
\(2.\)子串就是后缀的前缀
\(3.\)转换成序列问题然后数据结构维护。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步