一句話題解:
- “相等”等價於 \(\text{LCP}+\text{LCS}+k\ge\text{len}\)
- 對於每個字串 \(p\),列舉其 LCP 長度,同時確定 LCS 長度,問題變成統計有多少 \(i\),滿足 \(s[i-|\text{LCP}|+1..i]=\text{LCP}\),\(s[i+k+1..i+k+|\text{LCS}|]=\text{LCS}\)。
- 得出解法:對 \(p\) 建 ACAM,對其反串建 ACAM,一個 \(i\) 對 \(p[1..j]\) 有貢獻,相當於 \(s[1..i]\) 在 \(p[1..j]\) 的 fail 樹子樹中,且 \(s[i+k+1..n]\) 的反串在 \(p[j+k+1..|p|]\) 的反串的 fail 樹子樹中,條件形如 \(f(i)\in[l_1..r_1]\land g(i+k+1)\in[l_2..r_2]\),二維數點即可。
- 去重:答案 \(=\text{Ans}(k)-\text{Ans}(k-1)\)。
記一點程式碼上的問題:
- \(|p|\le k\) 時特判,\(\text{Ans}(k)=|s|-|p|+1,\text{Ans}(k-1)=0\)。
- 二維數點時矩形數應該開兩倍,因為對於每個 \(|p|\) 最多產生 \(|p|+1\) 個矩形,\(2\cdot10^5\) 個 \(p\) 最多產生 \(4\cdot 10^5\) 個矩形。