字尾資料結構太tm毒瘤了
給定乙個字串s,大小為n,下標從1開始。
sa[i]代表排名為i的字尾是哪乙個。
rk[i]代表第i個字尾的排名,滿足rk[sa[i]]=i。
h[i]代表第i個字尾的"高度",滿足h[i]=height[rk[i]]
height[i]代表排名為i的字尾與排名為i-1的字尾的lcp,即字尾樹上lca的深度。
下面先用倍增+基數排序法求出字尾陣列sa。
然後求出sa的反陣列rk。
h陣列有乙個性質:h[i]>=h[i-1]-1。證明:大概是利用字尾樹上某乙個子樹內儲存資訊比深度較淺的相似的樹儲存資訊少來證明,具體忘了。
然後利用sa和rk陣列即可求出height陣列。
在height陣列中,排名為i的字尾和排名為j的字尾的(i!=j)lcp為min(height[i+1],height[i+2],...,height[j-1],height[j])
這是乙個rmq問題,如果需要o(1)求出兩個字尾的lcp,可以將height陣列進行倍增st處理。
int n;
char s[300010];
int sa[300010], t1[300010], t2[300010], c[300010];
int rk[300010], height[300010], h[300010]; //height[i] = lca(i - 1, i)
void build(int m)
}int main()
}
資料結構模板 棧
此部落格是存的是我自己編寫的棧模板,如有錯誤請指出棧是操作受限的線性表,只允許在棧頂進行插入和刪除操作,遵循 後進先出 原則。include include define elemtype int define maxsize 1000 using namespace std 這是順序棧的模板 ty...
資料結構模板 佇列
此部落格是存的是我自己編寫的佇列模板,如有錯誤請指出佇列是操作受限的線性表,只允許在隊頭進行刪除操作,在隊尾進行插入操作,遵循 先進先出 原則。順序隊 存在假溢位問題 include include define elemtype int define maxsize 1000 using name...
資料結構模板合集
線段樹lazy操作模板 區間修改,區間查詢 class segment tree lazy inline void add int p,int v,int t inline void pushdown int p,int l,int r public inline void build tree i...