#G3009. 灯带开关
灯带开关
题目描述
舞台上有一条灯带,从左到右依次是第 盏到第 盏灯。每盏灯要么亮(用 1 表示),要么灭(用 0 表示)。把所有灯的状态从左到右写在一起,就得到一个长度为 的 01 串,也可以把它看成一个二进制数。
灯光师依次执行了 条指令,指令共有六种:
| 指令 | 含义 |
|---|---|
ON l r |
把第 盏到第 盏灯全部点亮 |
OFF l r |
把第 盏到第 盏灯全部熄灭 |
TOGGLE l r |
把第 盏到第 盏灯的状态全部反转(亮变灭,灭变亮) |
FLIP |
把所有灯的状态反转 |
LEFT |
所有灯的状态整体向左移动一格:第 盏灯变成原来第 盏灯的状态,最左边原来的状态丢掉,最右边的第 盏灯变为灭 |
RIGHT |
所有灯的状态整体向右移动一格:第 盏灯变成原来第 盏灯的状态,最右边原来的状态丢掉,最左边的第 盏灯变为灭 |
请输出所有指令执行完以后灯带的 01 串,以及这个 01 串作为二进制数对应的十进制数。
输入格式
第一行两个整数 。
第二行一个长度为 的 01 串,表示一开始每盏灯的状态。
接下来 行,每行一条指令,格式如上表。
输出格式
第一行一个长度为 的 01 串,表示最后每盏灯的状态。
第二行一个整数,表示这个 01 串作为二进制数的十进制值。
样例 #1
样例输入 #1
8 5
10100110
ON 2 3
OFF 6 8
FLIP
LEFT
TOGGLE 1 4
样例输出 #1
11001110
206
样例解释
| 指令 | 执行后的灯带 |
|---|---|
| (开始) | 10100110 |
ON 2 3 |
11100110 |
OFF 6 8 |
11100000 |
FLIP |
00011111 |
LEFT |
00111110 |
TOGGLE 1 4 |
11001110 |
。
提示
数据范围
- 对于 的数据:,,只有
ON和OFF两种指令; - 对于 的数据:没有
LEFT和RIGHT指令; - 对于 的数据:,,。
提示
- 因为 ,整条灯带可以用一个
int来存:第 盏灯是二进制的最高位,第 盏灯是最低位(第 位)。这样第 盏灯对应1 << (m - i)。 - 点亮用
|(按位或),熄灭用&和~,反转用^(按位异或),整体移动用<<和>>。 - 左移以后可能会多出第 位以上的
1,别忘了把它们去掉(可以& ((1 << m) - 1))。 - 用一维数组一盏一盏地模拟也是可以的。
相关
在下列比赛中: