#G3009. 灯带开关

    ID: 1057 传统题 1000ms 512MiB 尝试: 1 已通过: 1 难度: 普及− 上传者: 标签>GESP三级位运算二进制2026模拟

灯带开关

题目描述

舞台上有一条灯带,从左到右依次是第 11 盏到第 mm 盏灯。每盏灯要么亮(用 1 表示),要么灭(用 0 表示)。把所有灯的状态从左到右写在一起,就得到一个长度为 mm 的 01 串,也可以把它看成一个二进制数。

灯光师依次执行了 qq 条指令,指令共有六种:

指令 含义
ON l r 把第 ll 盏到第 rr 盏灯全部点亮
OFF l r 把第 ll 盏到第 rr 盏灯全部熄灭
TOGGLE l r 把第 ll 盏到第 rr 盏灯的状态全部反转(亮变灭,灭变亮)
FLIP 把所有灯的状态反转
LEFT 所有灯的状态整体向左移动一格:第 ii 盏灯变成原来第 i+1i+1 盏灯的状态,最左边原来的状态丢掉,最右边的第 mm 盏灯变为灭
RIGHT 所有灯的状态整体向右移动一格:第 ii 盏灯变成原来第 i−1i-1 盏灯的状态,最右边原来的状态丢掉,最左边的第 11 盏灯变为灭

请输出所有指令执行完以后灯带的 01 串,以及这个 01 串作为二进制数对应的十进制数。

输入格式

第一行两个整数 m,qm, q。

第二行一个长度为 mm 的 01 串,表示一开始每盏灯的状态。

接下来 qq 行,每行一条指令,格式如上表。

输出格式

第一行一个长度为 mm 的 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

(11001110)2=128+64+8+4+2=206(11001110)_2 = 128 + 64 + 8 + 4 + 2 = 206。

提示

数据范围

  • 对于 30%30\% 的数据:m≤8m \le 8,q≤1000q \le 1000,只有 ON 和 OFF 两种指令;
  • 对于 60%60\% 的数据:没有 LEFT 和 RIGHT 指令;
  • 对于 100%100\% 的数据:1≤m≤301 \le m \le 30,1≤q≤1051 \le q \le 10^5,1≤l≤r≤m1 \le l \le r \le m。

提示

  • 因为 m≤30m \le 30,整条灯带可以用一个 int 来存:第 11 盏灯是二进制的最高位,第 mm 盏灯是最低位(第 00 位)。这样第 ii 盏灯对应 1 << (m - i)。
  • 点亮用 |(按位或),熄灭用 & 和 ~,反转用 ^(按位异或),整体移动用 << 和 >>。
  • 左移以后可能会多出第 mm 位以上的 1,别忘了把它们去掉(可以 & ((1 << m) - 1))。
  • 用一维数组一盏一盏地模拟也是可以的。