後綴數組的一些技巧
阿新 • • 發佈:2017-05-29
重復 -s height 前綴 -h log erl 比對 技巧
後綴數組sa[i]:i<j,有sa[i]開頭的字符串字典序<sa[j]開頭字典序。
求後綴數組的方法:倍增{
按一段排序,倍增至第二段為第二關鍵字,把他的值搞到桶中,比較。
若兩個合並的串前後兩段一毛一樣,排名設為一樣。就這樣搞。
}
rnk[i]:i為開頭的後綴的排名
height數組:KMP的思想{
height數組為排名為i與i-1的後綴的最長公共子串。
利用KMP的思想:有h[rnk[i]]>=h[rnk[i-1]]-1;
那每次就從sa[rnk[i]-1] 開始比對。
}一般的,我們在字符串最後補個0,使排名從1開始。
後綴數組技巧:
1.對於可重復的最長重復子串問題,可以直接遍歷height[1..n],易知排名相鄰的字符串最相似。
2.對於不可重復的最長重復子串問題,可以二分答案,遍歷height[1..n]分組:
每組大於mid,若碰到一個小於mid的更新。
判斷這一組中的max(sa[i])-min(sa[i])是否大於等mid,
這意味著兩個距離大於mid,且存在公共子串長於mid。重新開始一輪。
有希望成為最長公共前綴不小於 k 的兩個後綴一定在同一組.所以可以O(nlogn)求出。
後綴數組的一些技巧