后缀数组

子串:从原串中选取连续的一段,即子串
空串也是子串
后缀:suf(k)为s(k…n)构成的子串
任何子串都是某个后缀的前缀
最长公共前缀 lcp(suf(i),suf(j))

问题:

将所有后缀suf(1),suf(2),suf(N)按照字典序从小到大排序

暴力sort N2 logN
二分+hash :
Nlog2N
cmp函数中二分suf(i)和suf(j)的lcp
return s[i+|lcp|] < s[j+|lcp|]
------- 以上为暴力做法
进入正文:
SA[1]排序第1的后缀的开始位置
Rank[i]=后缀suf(i)的排名
Rank[sa[l]] = l
sa[Rank[i]] = i
求sa然后得到rank
在这里插入图片描述
倍增
sub[i][k]:s从i开始长度为 2k的子串
sub[i][k] = s[i…i+(1<<k)-1 ],超过N的部分都视为

posted @ 2020-10-08 10:02  回归梦想  阅读(55)  评论(0编辑  收藏  举报