bryce1010專題訓練——字尾陣列
阿新 • • 發佈:2018-12-11
1. 定義介紹
-
字尾陣列 字尾陣列SA是一個一維陣列,它儲存1…n的某個排列SA[1],SA[2],…,SA[n]。並且保證Suffix(SA[i])<Suffix(SA[i+1]),1<=i<n。也就是S的n個字尾從小到大進行排序後把排好序的字尾的開頭位置順次放入SA中。
-
名次陣列 名次陣列Rank[i]儲存的是Suffix[i]在所有後綴中從小到大排列的名次。
簡單的來說,字尾陣列是“排第幾的是誰”?,名次陣列是“你排第幾?“
容易看出,字尾陣列和名次陣列互逆運算。
令是 和 的最長公共字首長度,即排名相鄰的兩個字尾的最長公共字首長度。比如就是anana$ 和ana$的最長公共字首,也就是ana,長度為3。你注意,這個height陣列有一個神奇的性質:若 rank[j] < rank[k],則字尾 Sj…n 和 Sk…n 的最長公共字首為 min{height[rank[j]+1],height[rank[j]+2]…height[rank[k]]}。這個性質是顯然的,因為我們已經字尾按字典序排列。
有了height,求最長可重疊重複K次子串就方便了。重複子串即兩字尾的公共字首,最長重複子串,等價於兩字尾的最長公共字首的最大值。問題就轉化成了,求height 陣列中最大的長度為 K的子序列的最小值。