bitset学习笔记

bitset 本质上是一个二进制串,优点是时间和空间复杂度都带有 \(\frac{1}{w}\) 的常数。

成员函数:

  • b.set() 全部赋值为 \(1\)
  • b.reset() 全部赋值为 \(0\)
  • b.flip() 将每一位取反。
  • b.count() 返回有多少个 \(1\)
  • b.any() 返回是否至少有一个 \(1\)
  • b.none() 返回是否全部为 \(0\)

每个函数的复杂度都是 \(O(\frac{n}{w})\),其中 \(n\) 为 bitset 的长度,而 \(w\) 则是常数 \(32\)\(64\)(不同环境下)。

bitset 支持按位与,按位或,按位异或,按位取反,左移右移,时间复杂度同样为 \(O(\frac{n}{w})\)

技巧:

  • 将 b 的 \(0 \sim x\) 位变为 \(0\)b = (b >> x) << x;
  • 只取 b 的 \(0 \sim x\) 位(\(N\) 为 bitset 总长度):b = (b << (N - x)) >> (N - x);

应用:

  • 有向图可达性问题(P4306)。
  • 优化 01 背包(P1537)。
  • 求字符串出现次数(CF914F)。
  • 维护颜色数 / 每个数是否出现(通常配合数据结构)(P3647)。

题单:https://www.luogu.com.cn/training/80043。

posted @ 2024-09-03 11:48  Creeper_l  阅读(13)  评论(0编辑  收藏  举报