LuoguP2408 不同子串個數(字尾自動機)

2022-05-11 15:45:11 字數 613 閱讀 8838

題目傳送門

先建好字尾自動機,然後答案就是$\sum_len[u]-len[link[u]]$。

為什麼這樣是對的?

每個狀態所代表的字串是沒有交集的,所以我們只需求出每個狀態有多少個子串。

其實在學習構建sam的時候我們學過link的乙個性質,就是len[link[x]]+1=min_len(x),且乙個狀態內的字串按長度從小到大排序是連續的。

通過這個性質很容易得到上面的式子。

#include using

namespace

std;

const

int n = 1000010

;struct

samtr[n];

int lst = 1, tot = 1

;int

n;long

long

ans;

char

s[n];

void insert(int

c) }

}int

main()

for (int i = 2; i <= tot; i++)

cout

}

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...

P2408 不同子串個數 SA LCP SAM

傳送門 經典的sa lc psa lcp sa lcp 題目。顯然所有子串數目為n n 1 2 dfrac 2n n 1 因此我們只需知道重複的子串有多少個。根據l cp lcplc p我們知道利用lcp lcplc p求出的hei ght i l cp i i 1 即排 名第i名 和第i 1名的最...