CFCF2158D.Palindrome Flipping

普及+/提高

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

给定两个长度均为 nn0101sstt。你可以进行如下操作:

  • 选择下标 l,r(1l<rn)l,r\,(1 \leq {\color{red}{l < r}} \leq n),使得子串 sl,rs_{l,r} 是回文串,并将该子串内所有位反转。

目标是通过上述操作最多 2n2n 次(可以为零次)后,使得 sstt 相等。

字符串 ss 的子串 sl,rs_{l,r} 指的是 ssll 位到第 rr 位(含端点)的连续字符子序列,其中 1l<rs1 \leq l < r \leq |s|。这里 s|s| 表示字符串 ss 的长度。

回文串是指正着和反着读都一样的字符串。例如,101\texttt{101}00\texttt{00} 是回文串,而 10\texttt{10} 不是。

反转子串的所有位,意为把 0\texttt{0} 变为 1\texttt{1}1\texttt{1} 变为 0\texttt{0}。例如,反转 101\texttt{101} 得到 010\texttt{010}

输入格式

每个测试点包含多个测试用例。第一行为用例数 TT1T51031 \leq T \leq 5\cdot 10^3)。接下来是每个用例的描述。

每个用例第一行为一个整数 nn4n1004 \leq n \leq 100),表示字符串 sstt 的长度。

接下来两行分别为二进制字符串 sstt

保证所有用例的 n2n^2 之和不超过 51055\cdot 10^5

输出格式

对于每组测试数据,如果无法完成目标,输出 1-1

否则,第一行输出一个整数 kk0k2n0 \leq k \leq 2n),表示操作次数。

接下来的 kk 行,每行输出两个整数 l,rl, r1l<rn1 \leq l < r \leq n),表示每次操作时选取的下标。注意,在每次操作时,sl,rs_{l,r} 必须是当时的回文串。

输入输出样例

  • 输入#1

    3
    5
    01011
    10000
    7
    1010101
    0101010
    4
    0010
    0010

    输出#1

    2
    1 3
    3 5
    1
    1 7
    0

说明/提示

对于第一个用例:

  • 初始 s=01011s = \mathtt{01011}t=10000t = \mathtt{10000}
  • 第一步,选择 l=1l=1r=3r=3s1,3=010s_{1,3}=\mathtt{010} 是回文串。翻转后 s=10111s=\mathtt{10111}
  • 第二步,选择 l=3l=3r=5r=5s3,5=111s_{3,5}=\mathtt{111} 是回文串。翻转后 s=10000s=\mathtt{10000}
  • 此时 ss 等于 tt

对于第二个用例:

  • 初始 s=1010101s = \mathtt{1010101}t=0101010t = \mathtt{0101010}
  • 第一步,选择 l=1l=1r=7r=7s1,7=1010101s_{1,7}=\mathtt{1010101} 是回文串。翻转后 s=0101010s=\mathtt{0101010}
  • 此时 ss 等于 tt

第三个用例:

  • 初始时 ss 就已经等于 tt,无需进行任何操作。
首页