你喜欢真正优秀的编程语言吗?例如,让我们来讨论一下 PHP。
与许多其他语言一样,PHP 支持数组。在本题中,我们仅考虑索引从 0 开始的连续整数索引数组。它将被表示为 $[a_0, a_1, \dots, a_{n-1}]$。
与许多其他语言一样,PHP 支持变量。所有变量都必须以 $ 符号开头。在本题中,我们将有两个变量:数组 $a 和它的元素 $x。
此外,与许多其他语言一样,PHP 支持遍历数组所有元素的循环。我们只考虑 foreach 循环四种可能形式中的两种:
- 非引用形式:
foreach ($a as $x) // code - 引用形式:
foreach ($a as &$x) // code
形式上,非引用形式会逐个遍历数组的元素,将 $x 的值设置为对应元素的值,然后执行指定的代码。引用形式会逐个遍历数组的元素,使 $x 成为对应元素的引用,然后执行代码。
因此,在第一种情况下,如果修改 $x 的值,数组元素的值不会改变;而在第二种情况下,数组元素的值会随之改变。
PHP 支持许多其他控制流结构。我们感兴趣的其中两个是 if 和 break。与其他语言一样,break 会立即终止循环,而 if 允许仅在满足某些条件时执行代码。
不幸的是,与许多其他语言不同,PHP 没有变量作用域。因此,即使在引用形式的 foreach 循环结束后,变量 $x 仍然会是指向它最后一次被设置的那个数组元素的引用。因此,在循环结束后修改它的值仍然会改变该数组元素的值。另一方面,使 $x 成为另一个元素的引用并不会改变前一个元素的值。让我们来看一个例子。
假设有一个数组 [1, 2, 3] 并执行以下代码:
foreach ($a as &$x) if ($x == 2) break;
foreach ($a as $x) if ($x == 2) break;
在第一个循环结束后,$x 是对数组中间元素(第二个元素)的引用。在第二个循环的第一步中,数组变为 [1, 1, 3],因为 $x 的值被改变为 1(数组的第一个元素),而由于 $x 仍然是中间元素的引用,中间元素的值也变成了 1。在第二步中,$x 的值将被改变为数组下一个元素(即中间元素)的新值,而这个值此时也是 1。它仍然不等于 2,因此在下一步中,$x 的值改变为 3(第三个元素),这也将中间元素的值改变为 3,最终数组的状态为 [1, 3, 3]。
如你所见,即使没有显式的变量赋值语句,代码也可以改变数组。
你能编写一个程序,仅使用上述示例中所示形式的语句,将一个数组转换为另一个数组吗?
输入格式
输入的第一行包含一个整数 $n$ — 数组 $a 的长度($1 \le n \le 50$)。
第二行包含 $n$ 个整数 $s_i$ — 数组的初始状态($1 \le s_i \le 100$)。
第三行包含 $n$ 个整数 $t_i$ — 数组的目标状态($1 \le t_i \le 100$)。
输出格式
如果无法将数组 $a 的状态从 $s$ 转换为 $t$,输出单行,包含一个整数 $-1$。
否则,输出的第一行必须包含一个整数 $k$ — 程序中的行数($0 \le k \le 10\,000$)。你不需要最小化这个值。
接下来的 $k$ 行中,每行都应当是以下形式之一:
foreach ($a as &$x) if ($x == <some integer value>) break;
或
foreach ($a as $x) if ($x == <some integer value>) break;
所有整数都必须为正数且不超过 100。不允许使用其他变量或语言结构。你应该尽可能严格地遵守格式,包括空格(例如,在非引用形式中,as 和 $x 之间应该有两个空格)。请注意,由于比赛规则中没有“格式错误(Presentation Error)”这一结果,如果你未能遵守这些要求,你将获得“答案错误(Wrong answer)”的结果。
你的代码将按照题面中描述的正式规则执行。它必须将数组 $a 从初始状态转换为目标状态。
样例
输入样例 1
3 1 2 3 1 3 3
输出样例 1
2 foreach ($a as &$x) if ($x == 2) break; foreach ($a as $x) if ($x == 2) break;
输入样例 2
2 1 2 1 3
输出样例 2
-1