字尾陣列(SA)學習記錄

2022-08-31 01:12:08 字數 2574 閱讀 7319

乙隻只會字尾自動機卻不會字尾陣列的弱雞做了一下hdu - 1403,結果sam被卡記憶體了,然後學習了一下sa。

以下兩道題都是求lcs,區別在於字串長度。

hdu - 1403

1 #include 2 #include 3 #include 

4 #include 5

#define rank rank

6using

namespace

std;

7const

int maxn = 2e5+10;8

char

str[maxn];

9int

sa[maxn], rank[maxn], height[maxn], sum[maxn], tp[maxn];

10//

rank[i] 第i個字尾的排名, sa[i] 排名為i的字尾的位置, height[i] 排名為i的字尾與排名為(i-1)的字尾的lcp

11//

sum[i] 基數排序輔助陣列, 儲存小於i的元素有多少個, tp[i] rank的輔助陣列(按第二關鍵字排序的結果),與sa意義一樣

12bool cmp(int *f, int x, int y, int w)

1314

void get_sa(char *s, int n, int

m)15

39int k = 0

;40 n--;

41for(int i = 0; i <= n; i++) rank[sa[i]] =i;

42for(int i = 0; i < n; i++)

4349}50

intmain()

5166 printf("

%d\n

", sol);67}

68return0;

69 }

view code

spoj - lcs

sa版本:

1 #include 2 #include 3 #include 

4 #include 5

#define rank rank

6using

namespace

std;

7const

int maxn = 5e5+10;8

char

str[maxn];

9int

sa[maxn], rank[maxn], height[maxn], sum[maxn], tp[maxn];

10//

rank[i] 第i個字尾的排名, sa[i] 排名為i的字尾的位置, height[i] 排名為i的字尾與排名為(i-1)的字尾的lcp

11//

sum[i] 基數排序輔助陣列, 儲存小於i的元素有多少個, tp[i] rank的輔助陣列(按第二關鍵字排序的結果),與sa意義一樣

12bool cmp(int *f, int x, int y, int w)

1314

void get_sa(char *s, int n, int

m)15

39int k = 0

;40 n--;

41for(int i = 0; i <= n; i++) rank[sa[i]] =i;

42for(int i = 0; i < n; i++)

4349}50

intmain()

5166 printf("

%d\n

", sol);67}

68return0;

69 }

view code

sam版本:

1 #include2

using

namespace

std;

3const

int kind=26;4

const

int maxn=250000;5

struct

state615

};16

intsz;

17 state st[maxn*2+5

];18 inline state* newnode(int len = 0)19

25 state *root,*last;

26void extend(int

w)27

35if

(p)3652}

53}54else cur->link=root;

55 last=cur;56}

57string

keyword;

58int

main()

5979

else

8091

else

92 tmp=0;93

}94 ans=max(ans,tmp);95}

96 cout

98return0;

99 }

view code

SA 字尾陣列 學習筆記

今天沒事幹,學了sa 其實是模擬賽掛了 引用資料 2009年國家集訓隊 洛谷 273期 我們記 sa i 為排名為 i 的字尾的開始位置。rk i 為開始位置為 i 的字尾的排名。我們採用基數排序,因為這樣在排序第一關鍵字的時候,第二關鍵字順序相對正確。舉例子就是21和12排序,因為你的程式不知道什...

SA 字尾陣列

首先一定要確定sa 是個什麼東西 sa i 表示的是排名為 i 的字尾是哪乙個 至於字尾 i的排名是多少,那個是ra nk i 當然啦 最最最難懂的就是基數排序 要是不用基數排序,每次對於乙個二元組直接so rt一下 這樣的複雜度是o nlog 2 對於二元組的基數排序應該是這樣做的 首先把所有元素...

字尾陣列SA

給定乙個字串s,按字典序排序s的所有子串 鬼知道什麼思想,好像沒有什麼思想。哦,想起來了,是倍增。考慮最簡單的字尾間o n o n 比較和快排o nlog n o n logn 總複雜度o n2lo gn o n 2log n 考慮優化字串間的比較,用倍增的思想,假設k 2 k 2 長度的已經比完了...