字尾陣列學習小結

2021-06-26 02:06:53 字數 1361 閱讀 3020

這兩天學習了字尾陣列,感想是,果然字尾陣列比網路流可愛的多,就像字串比圖論可愛的多。

有模板真好qvq。

總結了一下字尾陣列的幾個要點:

一.理解rank、sa、height三個陣列。

分別代表所構成的字尾陣列str[i](在程式裡並不表現出來)排名後的名次、排名後第i位是str中的哪乙個、str[sa[i]]和str[sa[i-1]]的最長公共字首長度。

二.構造s陣列。

分兩種情況.(目前遇到qvq)

1.輸入的元素是數字。

這種情況下直接存進s陣列就好。一共有n個數,s[0]到s[n-1]存1~n個數,s[n]賦值為0

2.輸入的元素是字母。

s可以定義成char型和int型,分別a過題,但綜合下來似乎用int型更靠譜一些。

這裡又漲了姿勢,乙個int型的s,和乙個char型的t,直接用s[i]=t[i]就可以把t[i]的ascii碼賦值給s了..對於長為l的字串,s[0]~s[l-1]存0到l-1位的字元對應的ascii碼,s[l]為0。

三.函式呼叫

da函式呼叫模式:da(n+1,m)。n是s陣列一直到被賦值的那一位,m是大於所有s中元素的值。

calheight函式呼叫:height(n)。

四.幾種題型

1.求兩個字串的最長公共子串長。

思路:把兩個字串拼接成乙個,中間用乙個比較大的字元隔開(比如「#」啊...或者直接賦值到127+)。然後求整個串的字尾陣列的最長公共字首,同時也要注意分屬兩個子串。

2.求可重疊至少出現k次的最長重複子串。

思路:二分查詢+字尾陣列。二分答案,遍歷height[i]是否》=mid, 是則sum++;最後判斷sum與k的大小關係,返回check(mid);二分出結果。

3.求不可重疊的最長重複子串。

思路:同上,二分加遍歷height。判斷不可重疊:兩個變數mmin,mmax記錄當前滿足條件長度的範圍的sa[i]的最大值和最小值。當出現不滿足條件的i時,判斷mmax-mmin是否大於某特定長度。(這種情況下是大於二分的mid,即子串長度)。

4.求最長回文序列

思路:兩個串合併為乙個,遍歷最大height,同時要滿足mmin和mmax乙個在第乙個串裡, 乙個在第二個串裡。

五.做法總結

字尾陣列的題似乎變化不大..模板比較好套,思路也大體一樣。首先遇見多個串,合併為乙個,兩個串之間用不同的且大於串中元素的數字分開,最後以0結尾。然後求的最長公共序列長,就要遍歷/二分height陣列,尋找最大的/合適的值。對於分屬不同串、不重疊的限定,使用mmin和mmax記錄sa[i],進行判斷。同時更新mmin和mmax。如果需要輸出所得子串,另外開乙個變數,記錄str[i]的i,以及所求的串的長度,從s中以%c單個輸出就好。

暫時這麼多qvq     加油加油

字尾陣列小結

搞了這麼多字尾陣列,寫個總結 其實羅穗賽的 裡已經都總結得很清楚了。我這裡對一些 的具體實現細節和一些要注意的地方做一些說明。字尾陣列很重要的三個陣列就是 rank,sa和height了 其中rank i 表示i這個字尾的排名,sa i 表示排在第i位的字尾的首字母位置,height i 表示排名第...

字尾陣列小結

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

字尾陣列小結

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