字尾陣列SA

2022-06-19 03:39:09 字數 801 閱讀 7164

sa[i]表示將所有字尾排序後第i小的字尾的編號

rk[i]表示字尾i的排名

sa[rk[i]]=i=rk[sa[i]]

1

inv get_sa()

37for (rint i=1; i<=n; ++i) printf("

%d "

,sa[i]);

38 printf("\n"

);39

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

%d "

,x[i]);

40 }

view code

將字串s複製乙份變成ss之後字尾排序

每次從首或尾取乙個字元組成字串,問所有能夠組成的最小字串

lcp(最長公共字首)

lcp(i,j)表示字尾i和字尾j的最長公共字首

height[i]=lcp(sa[i],sa[i-1]);  //第i名的字尾與它前一名的字尾的最長公共字首

出現k次意味著字尾排序後有至少連續k個字尾的lcp是這個子串

求出每相鄰k-1個height的最小值,再求這些最小值的最大值就是答案。

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 長度的已經比完了...

字尾陣列SA

原理 其本質就是把字串的所有字尾進行排序。用普通排序需要o nlogn 但是字串比較和數字比較不同,所以實際需要o n nlogn 為了讓這個過程快一點,所以有了倍增演算法,o nlogn 和dc3演算法,o n 倍增演算法比較簡單,也比較好寫,具體可以參考這個大佬的部落格。dc3演算法複雜一點,但...