字符串极端优化
bitset优化
bitset复杂度可以达到 \(O(n/32)\) ,一定程度上可以 \(n^2\) 过 \(10^5\) 。
例题CodeForces - 914F
题目问题在于统计 \(10^5\) 个 \(10^5\) 数量级的字符串匹配,传统字符串哈希或kmp只能做到 \(O(n^2)\) 。可以考虑引入bitset优化。理由如下
- 字符集较小,只包含小写字母
- \(\sum \lvert S \rvert <10^5\),总查询长度较小
- 不存在区间修改操作
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|}\) ,但。
未完待续

浙公网安备 33010602011771号