看這篇部落格前,先去了解一下字尾陣列的基本操作吧:字尾陣列入門(一)——字尾排序。
這篇部落格的內容,主要建立於字尾排序的基礎之上,進一步研究乙個\(height\)陣列以及如何求\(lcp\)。
\(lcp\),即\(longest\ common\ prefix\),是最長公共字首的意思。
而在字尾陣列中,\(lcp(i,j)\)表示字尾\(_\)與字尾\(_\)的最長公共字首的長度,注意是\(sa_i\)和\(sa_j\),而不是\(i\)和\(j\)。
先是幾個比較簡單的基本性質:
接下來,是一些比較複雜的性質:
這兩個性質雖然看似令人匪夷所思,但仔細理解其實還是能看懂的。
這兩個性質在\(lcp\)的求解過程中發揮著十分重要的作用。
為了方便求解\(lcp\),我們需要在定義乙個新的陣列:\(height\)陣列。
\(height_i\)表示的是\(lcp(i,i-1)\)。
因此\(lcp(i,j)\)的結果就是\(min_^jheight_i\),這似乎可以在知道\(height\)陣列的情況下用\(rmq\)實現\(o(1)\)求解。
於是關鍵來了:如何求出\(height\)陣列。
首先我們要知道乙個性質\(height_\ge height_-1\)。
這個性質我也不會證,反正它還是挺簡單的,背一下就好了。
這樣一來,我們每次可以把\(height_\)初始化為\(height_-1\),然後每次盡量向外延長即可,這一過程似乎與\(manacher\)演算法有點類似。
放乙份求\(height\)陣列及\(lcp\)的模板**:
class class_suffixarray
inline void getsa(char *s)//字尾排序,求sa陣列
}inline void getheight(char *s)//求height陣列
}class class_rmq//rmq求區間最值
//求lcp,注意特判x=y的情況
};
關於字尾陣列的倍增演算法和height陣列
自己看著大牛的 學了一下字尾陣列,看了好久好久,想了好久好久才懂了一點點皮毛tat 然後就去刷傳說中的字尾陣列神題,poj3693是進化版的,需要那個相同情況下字典序最小,搞這個搞了超久的說。先簡單說一下字尾陣列。首先有幾個重要的陣列 sa陣列 字尾陣列 儲存所有字尾排序後從小到大的序列。即sa i...
字尾陣列入門
字尾陣列 suffix array 指某個字串的所有字尾按字典排序後得到的陣列。陣列中只儲存字尾開始的位置。簡稱sa。字尾 從某個字串的某個開始位置到其末尾的字串子串,包括原串和空字串。例子 的字尾,字典排序 預設從小到大 開始以長度為1的字尾字串為排序規則對其sa進行排序,並求出其排名rank 藍...
字尾陣列入門,字尾陣列模板整理
我自己懶得寫,就是想寫個部落格儲存下大佬的部落格位址 點這模板題 大佬的模板 include include include include include include include include include include include define inf 0x3f3f3f3f d...