字符串极端优化

bitset优化

bitset复杂度可以达到 \(O(n/32)\) ,一定程度上可以 \(n^2\)\(10^5\)

例题CodeForces - 914F

题目问题在于统计 \(10^5\)\(10^5\) 数量级的字符串匹配,传统字符串哈希或kmp只能做到 \(O(n^2)\) 。可以考虑引入bitset优化。理由如下

  1. 字符集较小,只包含小写字母
  2. \(\sum \lvert S \rvert <10^5\),总查询长度较小
  3. 不存在区间修改操作

bitset实现

考虑枚举每一个小写字母的位置,做成26个bitset。匹配时,先建一个全为1的bitset \(Ans\) ,考虑首字母的bitset相取&,即确定了所有可能首字母的位置。在匹配第 \(i\) 个,将 \(b_{s_i}\) 向左移 \(i\) 位后再与 \(Ans\) 取与。

\[b_{S_2}>>1:1111111111111\\ \&[b_{S_1}] :1010101010001\\ \&Ans: 1111111111111\\ \]

代码

Ans.set();
for(int i=0;i<s.size();i++){
	Ans=Ans&(b[s[i]-'a'+1]>>i);
}

具体代码具体代码

分块优化

传统的字符串哈希复杂度为 \(O(n)\) ,对于有修改操作的字符串匹配来说,将哈希分块处理复杂度大大减小。

例题还是:CodeForces - 914F

记录 \(Hash_{i,j}\) 为字符串 \(S[i,i+j-1]\) 的哈希值,对于查询字符串 \(X\) 来说,只需要匹配 \(Hash_{i,|x|}\) ,但。

未完待续

posted @ 2025-08-17 20:06  allenyuan9038074  阅读(18)  评论(0)    收藏  举报