#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 輸入的字串,預處理的時候...