字尾陣列
先根據字串中字元的出現情況,給每一種字元乙個對應的排名(從1開始),作為第一次排序的結果
如此迴圈,直到第乙個位置加上倍增步數後超出字串長度為止,算作演算法結束,此時得到的排序結果即為sa陣列
總共排序次數為 logn
若排序使用快排o(nlogn),則總時間複雜度為o(nlog2n)
若使用基數排序,則可將排序複雜度降至o(n),總複雜度降為o(nlogn)
經典基數排序圖示:
完全看懂太難了,學會用法後複製貼上吧
const int n=100050;
int xx[n],yy[n],cnt[n]; //快取陣列
int sa[n],rk[n],height[n]; //結果
char str[n]; //字串
void getsa_da(int n,int m) //n=length+1,m表示待處理字串最大可能擁有的字元種類
}void getheight(int n)
int main()
字尾陣列 倍增演算法模板
關於字尾陣列的資料,可以看noi2009國家集訓隊 羅穗騫 的 字尾陣列 處理字串的有力工具 suffix array 倍增演算法 o n lgn build sa n 1,注意n 1 getheight n n 8 num 注意num陣列最後一位值為0,其它位須大於0 rank rank 0 n ...
資料結構 字尾陣列
學習了一下字尾陣列。這個題目是字尾陣列裡面比較經典的一種。字尾陣列有幾個比較經典的應用 字尾陣列主要是用於把乙個字串的字尾排序。先說幾個常用的陣列 sa陣列 sa i 表示排名為i的字尾在原串中的起始位置是多少 rank陣列 rank i 表示起始位置為i的字尾排名第幾 h陣列 h i 表示排名第i...
利用倍增演算法的字尾陣列
仍然不是很懂,貼篇文章放在這兒希望有朝一日能頓悟吧。老天,乙個字尾陣列不知道看了多少天,最後終於還是看懂了啊!最關鍵的就是一會兒下標表示排名,一會用數值表示排名繞死人了。我不知道手跑了多少次才明白過來。其實我也建議初學者手跑幾遍,但是一定要注意陣列的意義,否則就是無用功。s 輸入的字串,預處理的時候...