字尾陣列的理解於模板

2022-05-01 11:00:07 字數 1445 閱讀 2626

字尾陣列主要是得出: sa[i]=pos ;  排名第i的是pos位置開始的   (這裡用於排名的都是原串中以不同位置開始到最後的字串按照字典序排序)

height[i] 是 suffix(sa[i-1]) 和 suffix(sa[i]) 的最長公共字首長度,即排名相鄰的兩個字尾的最長公共字首長度。

原理可以參考:

**解釋:

#include#include

#include

#define rint register int

#define inv inline void

#define ini inline int

#define maxn 1000050

using

namespace

std;

char

s[maxn];

int y[maxn],x[maxn],c[maxn],sa[maxn],rk[maxn],height[maxn],wt[30

];int

n,m;

inv putout(

intx)

rint l=0

;

while(x) wt[++l]=x%10,x/=10

;

while(l) putchar(wt[l--]+48);}

inv get_sa()

for (rint i=1; i<=n; ++i) putout(sa[i]),putchar('');

}inv get_height()

putchar(

10);

for (rint i=1; i<=n; ++i) putout(height[i]),putchar('');

}int

main()

view code

模板:

#includeusing

namespace

std;

const

int maxn = 1000050

;char

s[maxn];

int y[maxn],x[maxn],c[maxn],sa[maxn],rk[maxn],height[maxn],wt[30

];int

n;int get_sa(int

m)for (int i=1; i<=n; ++i) printf("

%d",sa[i]),putchar('');

}int

get_height()

/*putchar(10);

for (int i=1; i<=n; ++i) putout(height[i]),putchar(' ');*/}

intmain()

view code

時間複雜度為 nlogn  :

有更加快了dc3演算法可以o(n) 得出

字尾陣列模板(詳細理解)

字尾陣列看了很久了,從基數排序開始看乙隻看到height陣列的實現也理解了很多東西,不過別人的東西再多也不是自己的,因此自己重新總結了一下,順便學乙個字尾陣列的模板備用,這裡以spoj 694為例。include include include include include using names...

模板題(字尾陣列的理解) 錯題本

題目描述 小苗在學習字串。在以下說明中,我們僅考慮由小寫字母構成的串。很不幸的是,小苗在學習 suffix array 時把概念記錯了 現在她認為陣列sa的互逆陣列是原串 s ss,然而sa的互逆陣列應該是rank 為了幫助小苗同學,現給定一字串 s ss 請你判斷是否存在 t tt 使得 s ss...

字尾陣列 模板

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...