見 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)
函式。