字尾陣列是將某個字串的所有字尾按照字典序排序後得到的陣列,陣列中儲存的是字串的起始下標。包括空串,所以如果字串的長度為\(n\),則字尾陣列中的元素個數為\(n+1\)
字尾陣列的計算有基於倍增的時間複雜度為\(o(n\log ^2n)\)的演算法,利用長度為\(k\)的排序結果對長度為\(2k\)的字串排序
設\(rank_k(i)\)表示從下標\(i\)開始,長度為\(k\)的字串在所有字串中的字典序順序
通過比較\(rank_k(i)\)與\(rank_k(j)\),\(rank_k(i+k)\)與\(rank_k(j+k)\),得到\(rank_(i)\)與\(rank_(j)\)的大小關係
const int maxn=400010;
int n,sa[maxn],rk[maxn],temp[maxn],rev[maxn],k;
bool cmp_sa(int i,int j)
}void construct_sa(int *s,int len, int *sa)
for(int i=0;i<=n;++i)
}}
字尾陣列 模板
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...
字尾陣列模板
過了期末了,繼續寫acm題 自己寫的字尾陣列模板。k,len,rank,sa,tmp,都要寫在外面,這樣就不用來回折騰了。也是使用倍增法來做的,得到乙個sa,儲存了字尾排在第i位的字尾的起始位置。因為空也算乙個字尾,所以函式中都是 len include include include includ...
模板 字尾陣列
include include includeusing namespace std const int max 20001 int num max int sa max rank max height max int wa max wb max wv max wd max int cmp int ...