總結 字尾陣列及應用

2022-05-11 17:12:20 字數 998 閱讀 5009

字尾陣列還是很難理解的,所以直接背個板子就好了。——anson語錄

為了下面方便,給出一些定義:

int sa[n];//從小到大排序後,第i個字尾是哪乙個

int rank[n];//第i個字尾是sa中的哪乙個

//由上可知:sa[rank[i]]=i;

int height[n];//lcp(suffix(sa[i]),suffix(sa[i-1])).

由於dc-3太複雜了,所以這裡只介紹倍增法:

#include#include#include#includechar s[1000010];

int n,sa[1000010],rank[1000010],height[1000010],t1[1000010],t2[1000010],c[1000010];

int a[1000010];

void sasort(int n,int m)

for(int i=1;i<=n;i++)rank[sa[i]]=i;

int f=0;

for(int i=1;i<=n;i++) }

int main()

這樣你就可以求出sa的一些必要的陣列(希望大家可以直接背模板)

有乙個字串s,求它的子串中至少出現過兩次的最長的子串。

考慮height的定義:兩個rank值相近的字串的prefix,那麼很顯然這樣子一定比rank值遠一些的更優啊!

所以答案就是\(max(height[i])(i∈(1,n))\)

有乙個字串s,求它的子串中至少出現過兩次的最長的子串(不可重疊)。

二分答案然後分成很多個集合就可以了。

給定乙個字串s,求它不同的子串的個數。

考慮一下每乙個字尾可以提供\(len-len1\)個子串,然後考慮有\(height_i\)個重複了。

直接加起來就好了

其實還沒有寫完(2018.12.20 16:39)

感謝菊隊的上古ppt

字尾陣列總結

附模板 字尾陣列 void build sa int m,int n int x wa,y wb,t for int i 0 i 0 i sa c x i i for int k 1 k n k 1 int p 0 for int i n k i k y p sa i k for int i 0 i...

字尾陣列總結

2子串個數問題 3迴圈子串問題 兩個字串串問題 2子串個數問題 多個字串問題總結 首先,使用倍增演算法求出對應sa,height值,時間複雜度o nlog n 具體定義參考國家集訓隊2009羅穗騫 中還給出一種線性dc3做法 include using namespace std const int...

字尾陣列的應用

本文參考了 字尾陣列 處理字串的有力工具 子串 字串s 的子串r i.j i j,表示r 串中從i 到j 這一段,也就是順次排列r i r i 1 r j 形成的字串。字尾 字尾是指從某個位置i 開始到整個串末尾結束的乙個特殊子串。字串r 的從第i 個字元開始的字尾表示為suffix i 也就是 s...