#P16857. [NWRRC 2019]Foreach

[NWRRC 2019]Foreach

题目描述

考虑 PHP 中的数组与 foreach

本题只考虑下标从 00 开始连续编号的数组:

[a0,a1,,an1].[a_0,a_1,\ldots,a_{n-1}].

程序中只有两个变量:数组 $a 和变量 $x

我们只允许使用以下两种 foreach 循环。

非引用形式:

foreach ($a as  $x) // code

引用形式:

foreach ($a as &$x) // code

在非引用形式中,循环依次访问数组元素,并将当前元素的值赋给 $x。因此修改 $x 不会直接修改当前数组元素。

在引用形式中,$x 会成为当前数组元素的引用,因此修改 $x 会同时修改对应数组元素。

此外,本题允许在循环体中使用 ifbreakbreak 会立即结束当前循环。

PHP 的一个重要特性是:循环结束后 $x 不会因为离开循环而失效。如果之前执行过引用形式的 foreach,那么 $x 在之后仍然保持为某个数组元素的引用,直到它被重新绑定为另一个引用。

例如,初始数组为 [1,2,3],执行:

foreach ($a as &$x) if ($x == 2) break;
foreach ($a as  $x) if ($x == 2) break;

第一次循环结束后,$x 引用数组的中间元素。

第二次循环的第一步会把 $x 的值改为第一个元素的值 1,于是数组变成 [1,1,3];之后继续执行,最终数组变为 [1,3,3]

可以看到,即使代码中没有显式赋值语句,数组仍然可能被修改。

现在给定初始数组 ss 和目标数组 tt。你需要只使用题目规定的 foreach 语句,构造一段程序,把数组从 ss 变成 tt

输入格式

第一行一个整数 nn

1n50.1\le n\le 50.

第二行包含 nn 个整数 sis_i,表示初始数组:

1si100.1\le s_i\le 100.

第三行包含 nn 个整数 tit_i,表示目标数组:

1ti100.1\le t_i\le 100.

输出格式

如果无法完成转换,输出:

-1

否则,第一行输出程序行数 kk

0k10000.0\le k\le 10000.

接下来 kk 行,每行必须严格为以下两种格式之一:

foreach ($a as &$x) if ($x == <some integer value>) break;

foreach ($a as  $x) if ($x == <some integer value>) break;

其中整数必须为 11100100

不允许使用任何其他变量或语言结构。

特别注意输出格式中的空格:非引用形式中 as$x 之间有两个空格。若格式不符合要求,会得到 Wrong Answer。

构造出的程序按照题目定义的形式化规则执行后,必须把 $a 从初始状态转换为目标状态。

样例

样例 1

3
1 2 3
1 3 3
2
foreach ($a as &$x) if ($x == 2) break;
foreach ($a as  $x) if ($x == 2) break;

样例 2

2
1 2
1 3
-1