CF1789D.Serval and Shift-Shift-Shift
提高+/省选-
通过率:0%
时间限制:2.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Serval has two n-bit binary integer numbers a and b. He wants to share those numbers with Toxel.
Since Toxel likes the number b more, Serval decides to change a into b by some (possibly zero) operations. In an operation, Serval can choose any positive integer k between 1 and n, and change a into one of the following number:
- a⊕(a≪k)
- a⊕(a≫k)
In other words, the operation moves every bit of a left or right by k positions, where the overflowed bits are removed, and the missing bits are padded with 0. The bitwise XOR of the shift result and the original a is assigned back to a.
Serval does not have much time. He wants to perform no more than n operations to change a into b. Please help him to find out an operation sequence, or determine that it is impossible to change a into b in at most n operations. You do not need to minimize the number of operations.
In this problem, x⊕y denotes the bitwise XOR operation of x and y. a≪k and a≫k denote the logical left shift and logical right shift.
Serval 有两个 n 位二进制整数 a 和 b。他希望将这两个数分享给 Toxel。
由于 Toxel 更喜欢数字 b,Serval 决定通过若干次(可能为零次)操作将 a 变为 b。每次操作中,Serval 可以任选一个介于 1 到 n 之间的正整数 k,并将 a 替换为以下两个数之一:
- a⊕(a≪k)
- a⊕(a≫k)
换言之,该操作将 a 的每一位向左或向右移动 k 个位置,移出边界的位被丢弃,空缺位置补 0;然后将移位结果与原 a 进行按位异或,并将结果赋回给 a。
Serval 时间有限,他希望至多执行 n 次操作便将 a 变为 b。请帮助他找出一个满足要求的操作序列,或判定在至多 n 次操作内无法将 a 变为 b。你无需最小化操作次数。
输入格式
Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤2⋅103). The description of the test cases follows.
The first line of each test case contains a single integer n (1≤n≤2⋅103) — the number of bits in numbers a and b.
The second and the third line of each test case contain a binary string of length n, representing a and b, respectively. The strings contain only characters 0 and 1.
It is guaranteed that the sum of n over all test cases does not exceed 2⋅103.
每个测试包含多个测试用例。第一行包含测试用例的数量 t(1≤t≤2⋅103)。随后是各测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤2⋅103)—— 表示数字 a 和 b 的二进制位数。
每个测试用例的第二行和第三行分别包含一个长度为 n 的二进制字符串,表示 a 和 b。这些字符串仅由字符 0 和 1 组成。
保证所有测试用例的 n 之和不超过 2⋅103。
输出格式
For each test case, if it is impossible to change a into b in at most n operations, print a single integer −1.
Otherwise, in the first line, print the number of operations m (0≤m≤n).
If m>0, in the second line, print m integers k1,k2,…,km representing the operations. If 1≤ki≤n, it means logical left shift a by ki positions. If −n≤ki≤−1, it means logical right shift a by −ki positions.
If there are multiple solutions, print any of them.
对于每个测试用例,如果无法在至多 n 次操作内将 a 变为 b,则输出单个整数 −1。
否则,在第一行输出操作次数 m(0≤m≤n)。
若 m>0,则在第二行输出 m 个整数 k1,k2,…,km,表示所执行的操作:若 1≤ki≤n,表示对 a 进行逻辑左移 ki 位;若 −n≤ki≤−1,表示对 a 进行逻辑右移 −ki 位。
若存在多种解法,输出任意一种即可。
输入输出样例
输入#1
3 5 00111 11000 1 1 1 3 001 000
输出#1
2 3 -2 0 -1
说明/提示
In the first test case:
The first operation changes a into \require{cancel}00111\oplus\cancel{001}11\underline{000}=11111.
The second operation changes a into \require{cancel}11111\oplus\underline{00}111\cancel{11}=11000.
The bits with strikethroughs are overflowed bits that are removed. The bits with underline are padded bits.
In the second test case, a is already equal to b, so no operations are needed.
In the third test case, it can be shown that a cannot be changed into b.
在第一个测试用例中:
第一次操作将 a 变为 \require{cancel}00111\oplus\cancel{001}11\underline{000}=11111。
第二次操作将 a 变为 \require{cancel}11111\oplus\underline{00}111\cancel{11}=11000。
带删除线的位是溢出而被移除的位;带下划线的位是补零填充的位。
在第二个测试用例中,a 已经等于 b,因此无需任何操作。
在第三个测试用例中,可以证明 a 无法变为 b。
输入解题思路,AI测评打分。不知道怎么写?