CF1231E Middle-Out
题目描述
本题灵感来源于《吹笛人》的故事。在 Hooli 的压缩竞争对手 Nucleus 发起挑战后,Richard 熬夜发明了一种新的压缩方法:middle-out。
给定两个长度相同的字符串 $s$ 和 $t$,它们的字符从左到右编号为 $1$ 到 $n$(即从开头到结尾)。
每次操作你可以进行以下动作:
- 选择任意一个合法的下标 $i$($1 \le i \le n$),
- 将 $s$ 的第 $i$ 个字符移动到字符串的开头,或者将 $s$ 的第 $i$ 个字符移动到字符串的结尾。
注意,这些操作不会改变字符串 $s$ 的长度。你只能对字符串 $s$ 进行操作。
例如,若 $s=$ "test",一次操作后可以得到:
- 如果 $i=1$ 并且移动到开头,结果为 "test"(字符串不变);
- 如果 $i=2$ 并且移动到开头,结果为 "etst";
- 如果 $i=3$ 并且移动到开头,结果为 "stet";
- 如果 $i=4$ 并且移动到开头,结果为 "ttes";
- 如果 $i=1$ 并且移动到结尾,结果为 "estt";
- 如果 $i=2$ 并且移动到结尾,结果为 "tste";
- 如果 $i=3$ 并且移动到结尾,结果为 "tets";
- 如果 $i=4$ 并且移动到结尾,结果为 "test"(字符串不变)。
你希望通过最少的操作次数将字符串 $s$ 变为字符串 $t$。如果无法将 $s$ 变为 $t$,输出 $-1$。
输入格式
第一行包含一个整数 $q$($1 \le q \le 100$),表示输入中独立测试用例的数量。
每个测试用例包含三行。第一行为一个整数 $n$($1 \le n \le 100$),表示字符串 $s$ 和 $t$ 的长度。第二行为字符串 $s$,第三行为字符串 $t$。$s$ 和 $t$ 均为长度为 $n$ 的仅包含小写拉丁字母的字符串。
测试用例中 $n$ 的总和没有限制(即允许 $q=100$ 且所有 $n=100$ 的输入)。
输出格式
对于每个测试用例,输出将 $s$ 变为 $t$ 所需的最小操作次数。如果无法完成转换,输出 $-1$。
说明/提示
在第一个示例中,一种最优操作方案如下:
- 对于第一个测试用例 $s=$ "iredppipe",$t=$ "piedpiper": "iredppipe" $\rightarrow$ "iedppiper" $\rightarrow$ "piedpiper";
- 对于第二个测试用例 $s=$ "estt",$t=$ "test": "estt" $\rightarrow$ "test";
- 对于第三个测试用例 $s=$ "tste",$t=$ "test": "tste" $\rightarrow$ "etst" $\rightarrow$ "test"。
由 ChatGPT 4.1 翻译