Bitset 乱搞字符串匹配

见 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) 函数。

posted @ 2024-07-16 00:41  LCat90  阅读(9)  评论(0编辑  收藏  举报