1. 程式人生 > >【2018.12.17】NOI模擬賽4

【2018.12.17】NOI模擬賽4

題目

WZJ題解

 

T1

T2

 

T3

字尾自動機+($parents$ 樹)樹鏈剖分

發現有大量子串需要考慮,考慮摁死子串的一端。

首先,這題顯然是一道離線題,因為所有的詢問都是 $1$ 到 某個數,也就是一個字首和,完全可以遞推處理。

所以先把所有的詢問按 $m$ 從小到大排序。

然後我們畫畫 $KMP$ 樹,發現一些神奇的性質。

 

設虛邊下面那個點為新加入的一個點(字元),如果這個點的編號(編號 即插入的這個字元是原串的第幾位) 比這棵樹上面原有的那些點的編號都大的話,那它一定會成為葉子節點。

也就是說,如果你按順序依次插入原串的每一位字元,每個新加入的字元一定都會加到樹的葉子處。

這樣的話,上面那些以前插入的節點的深度都沒有變,新加入一個點不會對之前的任何點的貢獻造成影響。

所以所有右端點範圍在 $[1,i]$ 內的子串的答案 就是所有右端點範圍在 $[1,i-1]$ 內的子串的答案 $+$ 所有右端點在第 $i$ 位的子串的答案。

這個可以二維字首和遞推求,即開一個 $fakeans$ 動態累加 所有右端點範圍在 $[1,i]$ 內的子串的答案,再開一個 $ans$ 動態累加累加 $fakeans$,這樣就算上了每一位固定為右端點 且左端點任意時的所有子串,即所有左右端點情況的子串。

 

我們考慮加入第 $i$ 位字元時,這個字元對答案的貢獻怎麼算。

我們再找找規律,會發現

 

如圖,也就是以原串第 $i$ 位為結尾的 $i$ 個字尾串。