博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 bitset 的一些题目
阅读量:6980 次
发布时间:2019-06-27

本文共 1405 字,大约阅读时间需要 4 分钟。

参考

bitset

bitset
b;b.any() // b中是否存在置为1的二进制位。b.none() // b中是否不存在置为1的二进制位。b.count() // b中置为1的二进制位的个数。b.size() // b中二进制位数的个数。b[pos] // 访问b中在pos处二进制位。b.test(pos) // b中在pos处的二进制位置为1么?b.set() // 把b中所有二进制位都置为1。b.set(pos) // 把b中在pos处的二进制位置为1。b.reset() // 把b中所有二进制位都置为0。b.reset(pos) // 把b中在pos处的二进制位置置为0。b.flip() // 把b中所有二进制位逐位取反。b.flip(pos) // 把b中在pos处的二进制位取反。b.to_ullong() // 返回一个有相同二进制位的 unsigned long long 类型的值。

想法

一般先考虑题目的暴力做法,如果复杂度有 \(1e9\) ,这时候就可能考虑 \(bitset\) 优化,一般题目中的关系类似于能不能?是不是?这种,或者可以用 \(bitset\) 优化 \(DP\)(背包 \(DP\) 比较多,或者用于记录路径之类) ,一个有趣的应用是对于一些字符串问题,字符串长度不长,但是动态更新,询问次数很多的情况,可以维护 \(bitset\) 进行快速求解。

题目

  • 显然二分图两边点数要尽可能相同,考虑 01背包DP, \(bitset\) 优化,二进制位 \(i\) 表示是否能构成点数量为 \(i\) 的一边。
  • 先进行类似于线段树的更新操作,然后用 \(bitset\) 加速状态转移。
  • \(bitset\) 加速传递闭包的计算。
  • 考虑前缀后缀,开两个 \(bitset\) 类型的 \(DP\) 数组,以前缀为例,\(dp[i][j][k]\) 表示到第 \(i\) 个数,一定不选 \(j\) 这个位置上的数,选了 \(k\) 个数时所有可能的和(二进制位为\(1\)表示有这样的和)。对于后缀的数组,如果二进制位 \(i\) 上的数字为\(1\),可修改为 \(bit[87-i]=1\),那么对于询问,枚举 \(k\) ,将前缀后缀按位与,检查是否有二进制位为\(1\)
  • 01背包 \(DP\)\(bitset\) 记录路径。
  • \(bitset\) 加速匹配。预处理不同字符可能出现的集合,如果到主串上的第 \(i\) 个字符,有 \(bit[j]=1\) 表示已经匹配了长度为 \(j\) 的模板串。\(bit<<1\) 等价于加入一个新的字符,利用前面的预处理可以判断转移是否合法(按位与),若不合法则对应的二进制位会变成 \(0\)
  • 背包 \(DP\)
  • \(bitset\) 优化字符串匹配。
  • 在最短路搜索的过程中使用 \(bitset\) 记录信息,表示从哪些点到当前点有最短路。
  • 离线查询。由于 \(a \% b = k\)\(0\leq k < b\),我们可以从大到小枚举这个 \(k\) ,统计答案,然后更新 \(bitset\)\(k\) 的倍数。

转载于:https://www.cnblogs.com/ftae/p/9296600.html

你可能感兴趣的文章
python 库
查看>>
Android模仿iPhone View旋转刷新数据动画详解
查看>>
Java解压zip文件(文本)压缩包
查看>>
checkbox点击切换选中状态
查看>>
2019,商业智能的10大未来趋势
查看>>
将ubuntu系统设置静态ip及ssh
查看>>
云原生应用的10大关键属性
查看>>
Android 在运行时请求权限
查看>>
MySql 语句优化
查看>>
Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
查看>>
切版网上线,启用qieban.cn
查看>>
Nginx防盗链,Nginx访问控制, Nginx解析php相关配置, Nginx代理
查看>>
WSFC 仲裁模型选择
查看>>
任意排列、组合终极Shell脚本
查看>>
linux实战考试题:批量创建用户和密码(不能使用循环)
查看>>
Docker配置指南系列(二):指令集(二)
查看>>
nginx 开发一个简单的 HTTP 模块
查看>>
DIY强大的虚拟化环境-技术可行性部分
查看>>
红旗Linux认证简介
查看>>
BGP详解
查看>>