字尾陣列小結

2021-07-02 02:11:12 字數 1088 閱讀 2095

搞了這麼多字尾陣列,寫個總結

其實羅穗賽的**裡已經都總結得很清楚了。我這裡對一些**的具體實現細節和一些要注意的地方做一些說明。

字尾陣列很重要的三個陣列就是:rank,sa和height了

其中rank[i]表示i這個字尾的排名,sa[i]表示排在第i位的字尾的首字母位置,height[i]表示排名第i的字尾和排名i-1的字尾的lcp(最長公共字首)

其中最重要的就是height陣列了,我們所有的計算幾乎都是要用到height陣列,而sa和rank陣列則是用於找到我們需要的height

字尾陣列的題目大致可以分為以下三類:

1、對單個字串的處理,諸如求最長公共子串,求不同的子串數,求出現k次不重疊的子串等等

其中最長公共子串直接求height陣列的最大值就好了,因為sa[i]和sa[j]的lcp為min(height[i+1],height[i+2]....height[j]),注意這裡是從height[i+1]開始,因為height[i+1]是表示i+1和i的lcp,對於height陣列這樣的表示,很容易在一些地方出錯

而不同的子串數則是所有的子串數減去各height值,我們可以這樣子來理解,對於sa[i]這個字尾,我們有height[i]個子串是在sa[i-1]中前面已經計算過了,所以減去就好

還有一道樓教主男人8題之一的,是求乙個重複出現兩次以上不重疊的子串,這道題的處理很巧妙,同時也要多注意轉化後的陣列和原陣列之間的關係,具體做法:

2、對兩個字串的處理,也是求最長重複子串之類的

對於兩個及以上的字串的處理辦法,都是把後面的字串接在第乙個字串後面,中間加分隔符隔開,由於一般這樣的題都不需要計算排名,所以加乙個在所有字串中都沒有出現的數就可以了

通過height[i]值分組這樣的思想也是很常見的,主要用於求長度大於k的子串

這裡特別說一下: 這道題是求兩字串的公共子串直接列舉那肯定會超時,我們這裡用到了乙個單調棧,每次加進來乙個數的時候,如果比棧頂的數小,那麼棧頂出棧,更新相應的權值和對應的公共子串數,直到棧為空或該數比棧頂大

還有一道是求a串裡沒有在b串中出現過的不同子串數,用總數減去和b重複的就好,然後還要注意a串裡自己去重

3、多字串的處理,這樣的題和兩個字串的處理也大同小異,就不說了

字尾陣列小結

一道模板題 字尾陣列 sa 是乙個比較強大的處理字串的演算法,是有關字串的比較基礎是嗎?演算法,所以必須掌握 實現主要有倍增和dc 3 而我太弱了只學了倍增 s 就是這個字串,長度為le nran k i 表示i到 len 這個字尾在所有字尾中的排名 sa i 表示排名為 i 的字尾的首字元下標 h...

字尾陣列小結

我為什麼要叫小結呢這明明就是個題解包啊 直接偷迪哥的就好辣 差異 大概是個板子,求出 height 陣列後直接單調棧即可 相似子串 首先 子串是字尾的字首 其次 每個字尾貢獻的本質不同子串的數量是 n i 1 he i 因為子串過多所以我們考慮運用上文性質來二分查排名 至於相似度 rmq 即可?sa...

字尾陣列學習小結

這兩天學習了字尾陣列,感想是,果然字尾陣列比網路流可愛的多,就像字串比圖論可愛的多。有模板真好qvq。總結了一下字尾陣列的幾個要點 一.理解rank sa height三個陣列。分別代表所構成的字尾陣列str i 在程式裡並不表現出來 排名後的名次 排名後第i位是str中的哪乙個 str sa i ...