Bitset 亂搞字串匹配

LCat90發表於2024-07-16

見 Alex 巨佬強調“正解做法”,遂作文以記之。https://www.cnblogs.com/alex-wei/p/bitset_yyds.html

CF914F Substrings in a String

首先差分,\(f(l+|t|-1)-f(r+1)\)。這裡 \(f(i)\) 表示 \(t\) 在原串的 \(i\) 位置結尾前面的匹配答案,即 endpos 在 \([i,n]\) 中。

我們對 \(S\) 的每個【字元】開一個 bitset,記錄這個字元在 \(S\) 中的出現位置。

每次匹配新建一個 bitset \(M\),將其與 \(T\) 串中的【每一個元素在 \(S\) 中的 bitset 透過移位維護的位置關係形成的新的 bitset】進行與運算。

容易發現如果這樣還有 1 位置,那一定就合法了。

容易發現這就是暴力匹配的過程,所以複雜度為 \(O(\dfrac{|S|\sum|T|}{w})\)\(10^5\) 秒了。也可以騙到很多分(((

ps:還沒搞懂 bitset。

ps:搞懂了,記住 bitset 是從右向左的就行。記住 set, reset, flip, >>, <<。

CF963D Frequency of String

注意不同子串的那個根號和結論即可驗證 bitset 做法正確性了,是線性根號 + bitset 暴力。

然後就是在暴力找位置的時候記住 _Find_first()_Find_next(i) 函式。

相關文章