sa[i]表示將所有字尾排序後第i小的字尾的編號
rk[i]表示字尾i的排名
sa[rk[i]]=i=rk[sa[i]]
1view codeinv 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 }
將字串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演算法複雜一點,但...