CF1789D Serval and Shift-Shift-Shift

题目描述

Serval 有两个 $n$ 位的二进制整数 $a$ 和 $b$。他想把这两个数分享给 Toxel。 由于 Toxel 更喜欢数字 $b$,Serval 决定通过若干(可能为零)次操作将 $a$ 变为 $b$。每次操作,Serval 可以选择任意一个 $1$ 到 $n$ 之间的正整数 $k$,并将 $a$ 变为以下两种数之一: - $a\oplus(a\ll k)$ - $a\oplus(a\gg k)$ 换句话说,这个操作会将 $a$ 的每一位向左或向右移动 $k$ 位,溢出的位会被移除,缺失的位用 $0$ 填充。将移位结果与原始 $a$ 进行按位异或,结果赋值回 $a$。 Serval 没有太多时间。他希望在不超过 $n$ 次操作内将 $a$ 变为 $b$。请你帮他找出一种操作序列,或者判断在最多 $n$ 次操作内无法将 $a$ 变为 $b$。你不需要使操作次数最少。 在本题中,$x\oplus y$ 表示 $x$ 和 $y$ 的[按位异或运算](https://en.wikipedia.org/wiki/Bitwise_operation#XOR)。$a\ll k$ 和 $a\gg k$ 分别表示[逻辑左移](https://en.wikipedia.org/wiki/Logical_shift)和[逻辑右移](https://en.wikipedia.org/wiki/Logical_shift)。

输入格式

每组测试数据包含多组测试用例。第一行包含一个整数 $t$($1\le t\le2\cdot10^{3}$),表示测试用例的数量。 每个测试用例的第一行包含一个整数 $n$($1\le n\le2\cdot10^{3}$),表示 $a$ 和 $b$ 的位数。 接下来的两行,每行包含一个长度为 $n$ 的二进制字符串,分别表示 $a$ 和 $b$。字符串只包含字符 $0$ 和 $1$。 保证所有测试用例中 $n$ 的总和不超过 $2\cdot10^{3}$。

输出格式

对于每个测试用例,如果无法在不超过 $n$ 次操作内将 $a$ 变为 $b$,输出一行 $-1$。 否则,第一行输出操作次数 $m$($0\le m\le n$)。 如果 $m>0$,第二行输出 $m$ 个整数 $k_1,k_2,\dots,k_m$,表示每次操作。如果 $1\le k_i\le n$,表示将 $a$ 逻辑左移 $k_i$ 位;如果 $-n\le k_i\le-1$,表示将 $a$ 逻辑右移 $-k_i$ 位。 如果有多种方案,输出任意一种即可。

说明/提示

在第一个测试用例中: 第一次操作将 $a$ 变为 $00111\oplus\sout{001}11\underline{000}=11111$。 第二次操作将 $a$ 变为 $11111\oplus\underline{00}111\sout{11}=11000$。 带删除线的位是被移除的溢出位,带下划线的位是补上的 $0$。 在第二个测试用例中,$a$ 已经等于 $b$,因此不需要任何操作。 在第三个测试用例中,可以证明无法将 $a$ 变为 $b$。 由 ChatGPT 4.1 翻译