不同子串個數

2022-08-17 05:27:21 字數 655 閱讀 5242

字尾陣列在處理子串問題時往往有奇效,因為字尾的字首即是子串,而字尾陣列正是按照字首排序的字尾

回到本題。因為字尾的字首是子串,則一條字尾與其它所有字尾的lcp的最長長度,即是這條字尾的字首子串中所有被重複計數的串的數量。

我們掏出求得的\(ht\)陣列。初學sa時大家一定接觸過乙個重要的\(\text\),即\(\operatorname(i,j)=\min\limits_ht_j\)。我們考慮當前字尾與其它任何一條串的lcp,發現它的表示式都包含\(ht_i\),即\(ht_i\)即為lcp的最長長度。則只需要求出所有子串數量減去\(\sum\limits_^ht_i\)即可。

**:

#includeusing namespace std;

typedef long long ll;

ll res;

int n,m,sa[1001000],rk[1001000],buc[1001000],x[1001000],y[1001000],ht[1001000];

char s[1001000];

void sa()

}void ht()

}int main()

SPOJ 694不同子串個數

求乙個字串的不同子串個數。字尾陣列求出sa和height 每 乙個 字尾sa i 貢 獻n 1 sa i 個前 綴,減去 heig ht i 就是和 前乙個後 綴相同的 字首個數 累加就 是答 案每乙個字尾sa i 貢獻n 1 sa i 個字首,減去height i 就是和前乙個字尾相同的字首個數,...

luogu P2408 不同子串個數

考慮反向操作,去計算有多少組相同的子串,對於一組大小為k的極大相同子串的集合,ans k 1。為了避免重複計算,需要一種有效的,有順序的記錄方案。比如說,對於每乙個相同組,按其起始點所在的位置排序,對於除了第乙個串以外的串,均記 1的貢獻。但這種東西是非常難以快速統計的。但是,可以對於每乙個相同組,...

luoguP2408不同子串個數

可以知道每乙個子串都是字尾的字首,那麼對於第 i 小的字尾的貢獻就可以表示為n sa i 1 然而會存在重複的子串,注意height陣列的定義,對於sa i 1 和sa i 只有height i 個子串會被重複計算,每次都減掉就好了 include include includeusing name...