QOJ.ac

QOJ

시간 제한: 2.0 s 메모리 제한: 512 MB 총점: 100 해킹 가능 ✓

#16794. Foreach

통계

你喜欢真正优秀的编程语言吗?例如,让我们来讨论一下 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 支持许多其他控制流结构。我们感兴趣的其中两个是 ifbreak。与其他语言一样,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

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.