CFCF2158D.Palindrome Flipping
普及+/提高
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
给定两个长度均为 n 的 01 串 s 和 t。你可以进行如下操作:
- 选择下标 l,r(1≤l<r≤n),使得子串 sl,r 是回文串,并将该子串内所有位反转。
目标是通过上述操作最多 2n 次(可以为零次)后,使得 s 与 t 相等。
字符串 s 的子串 sl,r 指的是 s 第 l 位到第 r 位(含端点)的连续字符子序列,其中 1≤l<r≤∣s∣。这里 ∣s∣ 表示字符串 s 的长度。
回文串是指正着和反着读都一样的字符串。例如,101 和 00 是回文串,而 10 不是。
反转子串的所有位,意为把 0 变为 1,1 变为 0。例如,反转 101 得到 010。
输入格式
每个测试点包含多个测试用例。第一行为用例数 T(1≤T≤5⋅103)。接下来是每个用例的描述。
每个用例第一行为一个整数 n(4≤n≤100),表示字符串 s 和 t 的长度。
接下来两行分别为二进制字符串 s 和 t。
保证所有用例的 n2 之和不超过 5⋅105。
输出格式
对于每组测试数据,如果无法完成目标,输出 −1。
否则,第一行输出一个整数 k(0≤k≤2n),表示操作次数。
接下来的 k 行,每行输出两个整数 l,r(1≤l<r≤n),表示每次操作时选取的下标。注意,在每次操作时,sl,r 必须是当时的回文串。
输入输出样例
输入#1
3 5 01011 10000 7 1010101 0101010 4 0010 0010
输出#1
2 1 3 3 5 1 1 7 0
说明/提示
对于第一个用例:
- 初始 s=01011,t=10000。
- 第一步,选择 l=1,r=3,s1,3=010 是回文串。翻转后 s=10111。
- 第二步,选择 l=3,r=5,s3,5=111 是回文串。翻转后 s=10000。
- 此时 s 等于 t。
对于第二个用例:
- 初始 s=1010101,t=0101010。
- 第一步,选择 l=1,r=7,s1,7=1010101 是回文串。翻转后 s=0101010。
- 此时 s 等于 t。
第三个用例:
- 初始时 s 就已经等于 t,无需进行任何操作。