1. 程式人生 > >【Codeforces 204E】Little Elephant and Strings

【Codeforces 204E】Little Elephant and Strings

大於 string 一個 出現 問題 包含 重要 多少 註意

Codeforces 204 E

題意:給\(n\)個串,求對於每一個串在至少\(k\)個串中出現的它的子串\(S_{l..r}\)有多少個。

思路:後綴自動機上\(dp\)。。。

我們首先構造出這\(n\)個串的後綴自動機,其中需要註意將某個串的構建完了後直接將\(lst\)指針賦為\(root\),那麽就可以包含這些串的所有子串並且不會有問題。

然後我們就考慮如何來算出某一個子串在\(n\)個串中出現了多少次。

假設現在我們從\(S_i\)的開頭走到第\(j\)位,走到了節點\(u\),那麽

看從\(u\)開始,沿著\(link\)一直走到\(root\)的一堆節點\(v_1..v_k\),這些節點表示的最長後綴沒有在\(S_i\)

中出現過,那麽它們現在就標記為在\(S_i\)中出現過了,然後這些節點代表了結尾為\(j\)的所有子串們(根據定義),所以沒有漏掉任何一個子串。

下面就是要求每一個節點對\(S_i\)的貢獻了。對於節點\(u\),它對任何一個串的貢獻就是它的\(link\)的貢獻加上如果它出現大於等於\(k\)次,那麽就再加上這個節點表示的子串數量:\(len_u-len_{link_u}\)(這個非常重要)。

那麽順著\(S_i\)跑到的每個節點\(u\)統計下答案就可以辣

【Codeforces 204E】Little Elephant and Strings