A16704 | Palindrome Flipping
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
给定两个长度均为 $n$ 的 $01$ 串 $s$ 和 $t$。你可以进行如下操作:
- 选择下标 $l,r\,(1 \leq {\color{red}{l < r}} \leq n)$,使得子串 $s_{l,r}$ 是回文串,并将该子串内所有位反转。
目标是通过上述操作最多 $2n$ 次(可以为零次)后,使得 $s$ 与 $t$ 相等。
字符串 $s$ 的子串 $s_{l,r}$ 指的是 $s$ 第 $l$ 位到第 $r$ 位(含端点)的连续字符子序列,其中 $1 \leq l < r \leq |s|$。这里 $|s|$ 表示字符串 $s$ 的长度。
回文串是指正着和反着读都一样的字符串。例如,$\texttt{101}$ 和 $\texttt{00}$ 是回文串,而 $\texttt{10}$ 不是。
反转子串的所有位,意为把 $\texttt{0}$ 变为 $\texttt{1}$,$\texttt{1}$ 变为 $\texttt{0}$。例如,反转 $\texttt{101}$ 得到 $\texttt{010}$。
- 选择下标 $l,r\,(1 \leq {\color{red}{l < r}} \leq n)$,使得子串 $s_{l,r}$ 是回文串,并将该子串内所有位反转。
目标是通过上述操作最多 $2n$ 次(可以为零次)后,使得 $s$ 与 $t$ 相等。
字符串 $s$ 的子串 $s_{l,r}$ 指的是 $s$ 第 $l$ 位到第 $r$ 位(含端点)的连续字符子序列,其中 $1 \leq l < r \leq |s|$。这里 $|s|$ 表示字符串 $s$ 的长度。
回文串是指正着和反着读都一样的字符串。例如,$\texttt{101}$ 和 $\texttt{00}$ 是回文串,而 $\texttt{10}$ 不是。
反转子串的所有位,意为把 $\texttt{0}$ 变为 $\texttt{1}$,$\texttt{1}$ 变为 $\texttt{0}$。例如,反转 $\texttt{101}$ 得到 $\texttt{010}$。
输入格式
每个测试点包含多个测试用例。第一行为用例数 $T$($1 \leq T \leq 5\cdot 10^3$)。接下来是每个用例的描述。
每个用例第一行为一个整数 $n$($4 \leq n \leq 100$),表示字符串 $s$ 和 $t$ 的长度。
接下来两行分别为二进制字符串 $s$ 和 $t$。
保证所有用例的 $n^2$ 之和不超过 $5\cdot 10^5$。
每个用例第一行为一个整数 $n$($4 \leq n \leq 100$),表示字符串 $s$ 和 $t$ 的长度。
接下来两行分别为二进制字符串 $s$ 和 $t$。
保证所有用例的 $n^2$ 之和不超过 $5\cdot 10^5$。
输出格式
对于每组测试数据,如果无法完成目标,输出 $-1$。
否则,第一行输出一个整数 $k$($0 \leq k \leq 2n$),表示操作次数。
接下来的 $k$ 行,每行输出两个整数 $l, r$($1 \leq l < r \leq n$),表示每次操作时选取的下标。注意,在每次操作时,$s_{l,r}$ 必须是当时的回文串。
否则,第一行输出一个整数 $k$($0 \leq k \leq 2n$),表示操作次数。
接下来的 $k$ 行,每行输出两个整数 $l, r$($1 \leq l < r \leq n$),表示每次操作时选取的下标。注意,在每次操作时,$s_{l,r}$ 必须是当时的回文串。
输入输出样例
输入 #1
3 5 01011 10000 7 1010101 0101010 4 0010 0010
输出 #1
2 1 3 3 5 1 1 7 0
对于第一个用例:
- 初始 $s = \mathtt{01011}$,$t = \mathtt{10000}$。
- 第一步,选择 $l=1$,$r=3$,$s_{1,3}=\mathtt{010}$ 是回文串。翻转后 $s=\mathtt{10111}$。
- 第二步,选择 $l=3$,$r=5$,$s_{3,5}=\mathtt{111}$ 是回文串。翻转后 $s=\mathtt{10000}$。
- 此时 $s$ 等于 $t$。
对于第二个用例:
- 初始 $s = \mathtt{1010101}$,$t = \mathtt{0101010}$。
- 第一步,选择 $l=1$,$r=7$,$s_{1,7}=\mathtt{1010101}$ 是回文串。翻转后 $s=\mathtt{0101010}$。
- 此时 $s$ 等于 $t$。
第三个用例:
- 初始时 $s$ 就已经等于 $t$,无需进行任何操作。
- 初始 $s = \mathtt{01011}$,$t = \mathtt{10000}$。
- 第一步,选择 $l=1$,$r=3$,$s_{1,3}=\mathtt{010}$ 是回文串。翻转后 $s=\mathtt{10111}$。
- 第二步,选择 $l=3$,$r=5$,$s_{3,5}=\mathtt{111}$ 是回文串。翻转后 $s=\mathtt{10000}$。
- 此时 $s$ 等于 $t$。
对于第二个用例:
- 初始 $s = \mathtt{1010101}$,$t = \mathtt{0101010}$。
- 第一步,选择 $l=1$,$r=7$,$s_{1,7}=\mathtt{1010101}$ 是回文串。翻转后 $s=\mathtt{0101010}$。
- 此时 $s$ 等于 $t$。
第三个用例:
- 初始时 $s$ 就已经等于 $t$,无需进行任何操作。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?