字尾陣列學習&模板
,裡面說的很清楚,各個變數的解釋還蠻清晰
該鏈結裡面有很多文章,這篇有圖形解釋,容易理解: 不過有書看也更好
字尾陣列的思想:
先比較所有字尾的 前2^0次方個字元,然後比較 前2^1次方個字元,然後 2^2,2^3,... 直到所有字尾的 前2^i 個字元比較不存在完全相同的情況,就停止。
1. 基數排序,用來減少排序複雜度
2. 迴圈得出答案
3. 注意終止條件
4. 有的時候da(int *r) ; valheight(int *r),你可能要改為 char*r; 一般對最後一位r[n]=0賦值,最好是用任何乙個小於你會用到的字串集的字元,比如對於(a-z)-(a-z)你就可以 r[n]='$';
5. 單純的da是沒法用的,一般我們都會用rank和height,鏈結裡也有,height儲存的是lcp,即最長公共字首。
6. rmq,查詢,查詢 i位置 開始的字尾和 j位置 開始的字尾的lcp,為了減少複雜度,我們要用到簡便演算法,a) 線段樹; b) st演算法。後者用得比較多。
倍增演算法模板:
(注意 n 還是 n+1 ;從 1 開始 還是 從 0 開始)
const int n = int(2e5)+10;
int cmp(int *r,int a,int b,int l)
// 用於比較第一關鍵字與第二關鍵字,
// 比較特殊的地方是,預處理的時候,r[n]=0(小於前面出現過的字元)
int wa[n],wb[n],ws[n],wv[n];
int rank[n],height[n];
void da(int *r,int *sa,int n,int m)
char str[n];
int sa[n];
int main()
題目見
字尾陣列聯絡專題
hdu5008-boring string problem(字尾陣列專題)
字尾陣列模板-boj477.新來的小妹妹 & boj477. 田田背課文
字尾陣列 模板
char s n 陣列的長度要為兩倍的 int n n全域性變數為字元陣列的長度的 int sa n 2 high n 2 rank n 2 tmp n 2 top n 2 void makesa void lcp int main gets s int len strlen s s len get...
字尾陣列模板
過了期末了,繼續寫acm題 自己寫的字尾陣列模板。k,len,rank,sa,tmp,都要寫在外面,這樣就不用來回折騰了。也是使用倍增法來做的,得到乙個sa,儲存了字尾排在第i位的字尾的起始位置。因為空也算乙個字尾,所以函式中都是 len include include include includ...
模板 字尾陣列
include include includeusing namespace std const int max 20001 int num max int sa max rank max height max int wa max wb max wv max wd max int cmp int ...