1. 程式人生 > >bryce1010專題訓練——字尾陣列

bryce1010專題訓練——字尾陣列

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]在所有後綴中從小到大排列的名次。

簡單的來說,字尾陣列是“排第幾的是誰”?,名次陣列是“你排第幾?“ 容易看出,字尾陣列和名次陣列互逆運算。

height[i]height[i]suffix(sa[i1])suffix(sa[i-1])

suffix(sa[i])suffix(sa[i]) 的最長公共字首長度,即排名相鄰的兩個字尾的最長公共字首長度。比如height[4]height[4]就是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的子序列的最小值。

2. 字尾陣列的兩種求法

2.1 倍增法

2.2 DC3演算法