題目鏈接
以下字符串采用Python記法。
題意
定義平方串形如 $PP$, 給定母串 $S$, 要求回答 $q$ 組詢問,每組詢問形如 $S[l:r]$ 有多少個本質不同平方子串。
數據范圍:$|S|, q \le 2\times10^5$.
題解
這里run的記法是 $(i, j, p)$ 表示 $S[i:j]$ 的最小周期為 $p$, 且該性質不可向左右擴展。
任意一個平方子串 $S[i:j]$ 必然含於恰好一個run $(i_r, j_r, p)$ 使得 $2p \mid j-i, i_r \le i<j \le j_r$.
先求出所有run. 一個run $(i, j, p)$ 的平方子串形如 $S[u:u+2kp]$, 其中 $k \in \mathbb N^*$, $i \le u<u+2kp \le j$.
考慮其上一次出現為 $S[v:v+2kp]$, 那么對於 $r \ge u+2kp$ 且 $v<l \le u$ 的詢問 $(l, r)$ 其貢獻 $1$ 的答案。把它拆成前綴相減的形式,即對 $r \ge u+2kp, l \le u$ 的詢問 $(l, r)$ 貢獻 $1$ 的答案,並對 $r \ge u+2kp, l \le u$ 的詢問 $(l, r)$ 貢獻 $-1$ 的答案。
考慮把這個過程畫到坐標上。那么也就是,一組如此的 $(i, j, p, u, k)$ 將在 $(u, u+2kp)$ 上放置權值 $+1$, 在 $(v, u+2kp)$ 上放置權值 $-1$, 每次詢問 $(l, r)$ 即詢問 $\begin{cases}x \ge l\\y \le r\end{cases}$ 區域內的所有點權值和。
我們注意到,對於 $u \ge i+p$, 均有 $v=u-p$, 否則 $v<i$. 我們首先特殊處理這些 $i \le u<i+p$ 的串帶來的 $-1$ 權值。每個如此的 $(i, j, p, k, u)$ 都與本原平方串 $S[u+2(k-1)p:u+2kp]$ 對應,不同的該五元組對應的本原平方串不同,所以總數為 $O(n\log n)$ 級別。$v$ 可以用哈希表查詢。把詢問按照 $r$ 離線,分塊維護,所以這部分時間復雜度 $O(n\log n+q \sqrt n)$, 空間復雜度 $O(n\log n)$.
我們接下來還需要考慮點 $(u, u+2kp)$ 及點 $(u-p, u+2kp)$.
注意到枚舉 $(i, j, p, k)$ 為 $O(n)$ 級別。對於一個Run和枚舉的 $k$, 我們發現兩類權值的貢獻上,放置的點都形如 $(x, x+b)$ ($L \le x \le R$) 的形式。問題轉化為:有一些斜線 $(L, R, b, v)$ 表示對於所有 $x \in [l, r], y=x+b$ 的 $(x, y)$ 都放置 $v$ 的權值,求 $\begin{cases}x \ge l\\y \le r\end{cases}$ 這塊區域的權值和。
下圖是查詢 $ababababa$ 中 $[1:8]$ 區間的情況。黑斜線表示 $+1$, 紅斜線表示 $-1$. (畫圖工具:GeoGebra)
把它拆成兩個區域 $\begin{cases}b \le r-l\\y \le r\end{cases}$ 和 $\begin{cases}b \le r-l\\x<l\end{cases}$ 內權值和的差,按照 $r-l$ 離線,對 $x, y$ 各自區間修改、區間查詢,仍然分塊,時間復雜度 $O((n+q)\sqrt n)$.
下圖直觀地展示了如此拆分的意義。
綜上所述,本題在 $O((n+q)\sqrt n)$ 時間、$O(n\log n+q)$ 空間內得到解決。如果把分塊全部換成線段樹,時間復雜度是 $O(n\log^2 n+q \log n)$.