字尾陣列的應用一

2021-08-28 07:24:36 字數 987 閱讀 3828

1、可重疊的最長連續子串

題意:給乙個字串,問重複出現的連續的子串中最長的,重複的子串可以有重疊的部分,若結果不止乙個則輸出字典序最小的

例:對於字串"abcabcabc",結果為"abcabc";對於字串"abcdggabc",結果為"abc"

解法:找到height陣列中最大的,假設height[i]是最大的,其值為s,則字尾sa[i]的前s個字元就是結果

2、不可重疊的最長連續子串

題目:poj1743

題意:給乙個字串,問重複出現的連續的子串中最長的,重複的連續子串不能有重疊的部分,若結果不止乙個則輸出字典序最小的

例:對於字串"abcabcabc",結果為"abc";對於字串"abcdggabc",結果為"abc"

3、可重疊且至少出現k次的最長連續子串

題目:poj3261

題意:給乙個字串,問重複出現至少k次的連續的子串中最長的,重複的子串可重疊,若結果不止乙個則輸出字典序最小的

例:對於字串"abcabcabcabc",若k=3,結果為"abcabc";對於字串"abcdgggabc",k=3,結果為"g"

4、連續子串個數

題目:spoj-disubstr

spoj-subst1

題意:給乙個字串、求出字串中不同的連續子串的個數

例:對於字串"abc",結果為3+2+1=6;對於字串"abcc",結果為:3+3+2+1=9

解法:其實結果就是所有子串的個數減去height陣列之和,至於為什麼這樣做是正確的呢?顯而易見,最終結果=所有子串的個數-重複的子串個數,考慮每個位置i對重複子串的貢獻度,對於以位置i開始的字串,這些字串的有多少是重複的呢?其實就是字尾i與其他字尾的最長公共字首長度,也就是height[ rank[i] ],所以所有的重複的子串就是每個位置的對於重複子串的貢獻度之和,也就是height陣列之和

字尾陣列的應用

本文參考了 字尾陣列 處理字串的有力工具 子串 字串s 的子串r i.j i j,表示r 串中從i 到j 這一段,也就是順次排列r i r i 1 r j 形成的字串。字尾 字尾是指從某個位置i 開始到整個串末尾結束的乙個特殊子串。字串r 的從第i 個字元開始的字尾表示為suffix i 也就是 s...

字尾陣列的應用

1.求乙個字串所有不同的子串個數 子串意味著是連續的 比如 abaaba 它的字串包括 a,b,aa,ab,ba,aba,baa,aab,abaa,baab,aaba,abaab,baaba,abaaba。這個就可以用字尾陣列的結果求解。首先,我們知道sa陣列,裡面是排好序的所有字尾,運用字尾的想法...

字尾陣列學習與應用

sa i 即,排名為i的字尾的起點下標 rank i 即,第i個字尾的排名 height i 即,sa i 和sa i 1 的最長公共字首 h i 即,height rank i 即第i個字尾與前一名的最長公共字首 結論一 定義 lcp i,j lc p su ffix sa i s uffi x ...