01串状态压缩(位运算)
题目描述:
农夫约翰对牛棚里昏暗的灯光感到不满,刚刚安装了一个新吊灯。
新吊灯由 N 个灯泡组成,这 N 个灯泡围成一圈,编号为 0∼N−1。
奶牛对这个新吊灯非常着迷,并且喜欢玩以下游戏:
对于第 i 个灯泡,如果在 T−1 时刻,它左侧的灯泡(当 i>0时,为第 i−1 个灯泡;当 i=0时,为第 N−1 个灯泡-)是开着,那么在 T时刻,就切换这个灯泡的状态。
这个游戏将持续 B 单位时间。
给定灯泡的初始状态,请确定在 B单位时间后,它们的最终状态。
输入格式:
第一行包含两个整数 N和 B。
接下来 N 行,按顺序描述每个灯泡的初始状态,每行包含一个整数 1(表示开)或 0(表示关)。
输出格式:
共 N行,按顺序每行输出一个灯泡的最终状态。
数据范围:
3≤N≤16,
1≤B≤1015
输入样例:
5 6
1
0
0
0
0
输出样例:
1
1
1
0
1
样例解释:
灯泡状态如下:
时刻 T=0: 1 0 0 0 0
时刻 T=1: 1 1 0 0 0
时刻 T=2: 1 0 1 0 0
时刻 T=3: 1 1 1 1 0
时刻 T=4: 1 0 0 0 1
时刻 T=5: 0 1 0 0 1
时刻 T=6: 1 1 1 0 1
#include<stdio.h>
#include<string.h>int N = 1 << 16; //最多有(1*2的16次方)种不同的状态
int n;
long long m;int upstate(int state)
{int res = 0; //state表示当前状态,res表示下一个状态for(int i = 0; i < n; i ++ ) //枚举每一位 {int j = (i - 1 + n) % n; //i-1表示前一位,+1是因为可能存在负数 int x = state >> i & 1; //state的第i位 int y = state >> j & 1; //state的第j位 res |= (x ^ y) << i;} return res;
}void print(int state) //将十进制数转化成二进制数,输出每一位
{for(int i = 0; i < n; i ++ ){printf("%d\n",state >> i & 1);}
}int main()
{int state = 0;int p[N]; //每个状态是第几步走到的 scanf("%d %lld", &n, &m);for(int i = 0; i < n; i ++ ){int x;scanf("%d",&x);state |= x << i; //第i位是x,把x加到state的第i位上 }memset(p, -1, sizeof(p));p[state] = 0;for(int i = 1; ; i ++) //枚举步数 {state = upstate(state);if (i == m) //在形成环之前已经走完m步了 {print(state);break;}else if (p[state] == -1) p[state] = i; //当前状态未被初始化 else //这个状态走过了,即发现一个环 {int len = i - p[state]; //环的长度 int r = (m - i) % len; //还需要走r步 while(r -- ) state = upstate(state);print(state);break;}}return 0;}
01串状态压缩:对于只由0和1组成的数字序列(01串),除了用字符串存储,还可以把01串看成一个二进制数,转化成十进制存到一个int里,用int来表示一个状态。
因为灯泡只有开(1)和关(0)两种状态,且3 <= N <=16,所以最多有216种不同的状态,第216+1种状态一定会与前面某个状态相同,当时间足够长时,灯泡的状态变化会形成一个环。
位运算:
按位与 &
如果 x == 1 且 y == 1,则(x & y) = 1,否则(x & y) = 0
应用:让某一位或某几位为0;取一个数中的一段。按位或 |
如果 x == 1 或 y == 1,则(x | y) = 1,否则(x | y) = 0
应用:让某一位或某几位为1;把两个数拼起来 。按位取反 ~
~x = 1 -x ,把1位变0,0位变1。按位异或 ^
如果 x == y ,则(x ^ y)= 0,否则(x ^ y)= 1;
x ^ y ^ y —> x。左移 <<
i << j : i 中所有的位向左移动 j 个位置,而右边填入0;
x << = 1 等价于 x *= 2; x << = n 等价于 x *=2n。右移 >>
i >> j : i 中所有的位向右移动 j 个位置;
对于unsigned的类型,左边填入0;对于signed的类型,左边填入原来的最高位(保持符号不变);
x >>= 1 等价于 x /= 2; x >> = n 等价于 x /=2n。
输出一个二进制数:
#include<stdio.h>
int main()
{int number;scanf("%d",&number);unsigned mask = 1u << 31; //共32个比特位,最高位为1 for( ; mask; mask >>= 1){printf("%d",number & mask ? 1 : 0); //如果取&的结果不等于0,则输出1,否则输出0 } return 0;
}
01串状态压缩(位运算)相关推荐
- POJ - 3279 Fliptile(状态压缩+位运算+暴力)
题目链接:点击查看 题目大意:给出一个n*m的01矩阵,为了好描述,我们设0和1是两个相反的状态,我们的目标是要将整个矩阵全部变成1,现在我们可以将某一个点(x,y)更改为相反的状态,不过相应的该点周 ...
- hdu3006 状态压缩+位运算+hash(小想法题)
题意: 给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路: 是个小想法题目,要用到二进制压缩,位运算, ...
- 洛谷P1562 还是N皇后(DFS+状态压缩+位运算)
八皇后问题的介绍在此不再赘述,只贴一下经典八皇后问题的实现代码(参考刘汝佳 <算法竞赛入门经典>) void search(int i) {if(i>n){ans++;return; ...
- POJ-2414 Phylogenetic Trees Inherited 状态压缩,位运算处理集合操作
该题解题过程非常优美,通过位操作来维护一个可选字符集合.并且完成求并集和交集. 详见代码: #include <cstring> #include <cstdio> #incl ...
- LeetCode 2157. 字符串分组(状态压缩+位运算+图的遍历)
文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的字符串数组 words . 每个字符串都只包含 小写英文字母 .words 中任意一个子串中,每个字母都至多只出现一次. 如果通 ...
- java 位运算 多个状态_位运算表示对象所处状态
通过一个integer类型属性来表示对象所处的状态: CASE: Invitor:邀请者对象模型 Integer Invitor.joinstatus:邀请者所处参加状态 当前存在状态声明:是否被邀请 ...
- 程序员面试金典 - 面试题 16.01. 交换数字(位运算swap)
1. 题目 编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值. 示例: 输入: numbers = [1,2] 输出: [2,1]提示: numbers.length ...
- c语言位运算符的应用,c语言位运算(c语言位运算符的用法)
a=1^8 b=32^32 c=7^3 d=4&3 e=4|3 f=1&-1 求值 求详解 求值 为什么等于这么. 一.位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ...
- 位运算 位运算应用
本页目录 位运算分为2个大类 位于 &(一0则0) 位或| (双0则0) 异或 ^(互异则1) 利用异或可实现一个小面试题,如何不添加变量,实现数据的替换 按位取反 ~ 左移 << ...
最新文章
- iPhone 隐私新规下的“大地震”:四大平台损失近百亿美元,“连用户是男是女都分不清……”
- STM32开发 -- 自动连接一个未保存过的WIFI
- 国内SAP UI5使用者关于性能优化和UI5 Web Component的讨论
- 标识为普通SQL语法
- ftp的本地用户搭建
- 中国智慧VS西方智慧-看中国IT风云与IT产业怪状
- linux开源游戏_2014年杰出的开源和Linux游戏
- GAE 博客——B3log Solo 0.3.0 正式版发布了!
- Java基础回顾Application(二)
- VisualTreeHelper
- 美国网络安全体系架构揭秘
- html src data:image,Browser/HTML Force download of image from src=“data:image/jpeg;base64…”
- Tableau 发布到tableau online错误
- t-SNE 高维数据可视化
- mysql order by注入_sql注入之order by注入
- ioi 赛制_如何评价 IOI 2017(国际信息学奥林匹克竞赛)?
- rom是计算机硬件吗,rom,教你手机中ram和rom的区别
- bootstrap 黑边框表格样式_bootstrap4 使用及常用样式详细整理
- 【原】通俗说法所谓数码相机的“动态像素”和“静态像素”背后的故事
- 【Windows】如何修改远程桌面端口3389
热门文章
- swi 指令能用在C语言吗,arm处理器异常处理-swi - zgolee的专栏 - CSDN博客
- 互联网小现象:BAT疯狂投资,网易为何单打独斗?
- randperm算子不支持导出onnx
- Eureka的UNKNOWN
- 魔兽美服服务器维护,心得:美服12小时纯任务练级获服务器第一90级
- 【华为OD机试真题 python】完美走位【2022 Q4 | 100分】
- QS发布2021年世界大学排名!你报考的大学排第几?
- 地图可视化不只是pyecharts.map
- 3.3差错控制(检错编码、纠错编码)
- Java Bean Validation 详解