字尾陣列 羅穗騫倍增演算法詳細注釋

2021-08-25 16:47:25 字數 736 閱讀 7088

#include

const int maxn=100010;  

int wa[maxn],wb[maxn],wv[maxn],ws[maxn];  

int cmp(int *r,int a,int b,int l)  

//就像**所說,由於末尾填了0,所以如果r[a]==r[b](實際是y[a]==y[b]),說明待合併的兩個長為j的字串,前面那個一定不包含末尾0,因而後面這個的起始位置至多在0的位置,不會再靠後了,因而不會產生陣列越界。   

//da函式的引數n代表字串中字元的個數,這裡的n裡面是包括人為在字串末尾新增的那個0的,但**的圖示上並沒有畫出字串末尾的0。   

//da函式的引數m代表字串中字元的取值範圍,是基數排序的乙個引數,如果原序列都是字母可以直接取128,如果原序列本身都是整數的話,則m可以取比最大的整數大1的值。   

void da(int *r,int *sa,int n,int m)  

//最後再說明一點,就是關於da和calheight的呼叫問題,實際上在「小羅」寫的源程式裡面是如下呼叫的,這樣我們也能清晰的看到da和calheight中的int n不是乙個概念,同時height陣列的值的有效範圍是height[1]~height[n]其中height[1]=0,原因就是sa[0]實際上就是我們補的那個0,所以sa[1]和sa[0]的最長公共字首自然是0。   

da(r,sa,n+1,128);  

calheight(r,sa,n);  

字尾陣列 羅穗騫倍增演算法詳細注釋

link include const intmaxn 100010 intwa maxn wb maxn wv maxn ws maxn intcmp int r,inta,intb,intl 就像 所說,由於末尾填了0,所以如果r a r b 實際是y a y b 說明待合併的兩個長為j的字串,前...

字尾陣列 倍增演算法模板

關於字尾陣列的資料,可以看noi2009國家集訓隊 羅穗騫 的 字尾陣列 處理字串的有力工具 suffix array 倍增演算法 o n lgn build sa n 1,注意n 1 getheight n n 8 num 注意num陣列最後一位值為0,其它位須大於0 rank rank 0 n ...

利用倍增演算法的字尾陣列

仍然不是很懂,貼篇文章放在這兒希望有朝一日能頓悟吧。老天,乙個字尾陣列不知道看了多少天,最後終於還是看懂了啊!最關鍵的就是一會兒下標表示排名,一會用數值表示排名繞死人了。我不知道手跑了多少次才明白過來。其實我也建議初學者手跑幾遍,但是一定要注意陣列的意義,否則就是無用功。s 輸入的字串,預處理的時候...