1. 程式人生 > >後綴數組的一些技巧

後綴數組的一些技巧

重復 -s height 前綴 -h log erl 比對 技巧

後綴數組sa[i]i<j,sa[i]開頭的字符串字典序<sa[j]開頭字典序。

求後綴數組的方法:倍增{

  按一段排序,倍增至第二段為第二關鍵字,把他的值搞到桶中,比較。

  若兩個合並的串前後兩段一毛一樣,排名設為一樣。就這樣搞。

}

rnk[i]i為開頭的後綴的排名

height數組:KMP的思想{

  height數組為排名為ii-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)求出。

後綴數組的一些技巧