P3735 字串 題解

Laijinyi發表於2024-09-09

一句話題解:

  • “相等”等價於 \(\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\) 個矩形。

相關文章