子串:从原串中选取连续的一段,即子串
空串也是子串
后缀: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的部分都视为