#D. 红楼

    传统题 文件IO:hong 1000ms 256MiB

红楼

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目背景

一个是阆苑仙葩,一个是美玉无瑕。——《枉凝眉》

题目描述

有一天 33DAI 睡觉做梦进入了喵喵幻境。喵喵幻境有一门编程语言叫做喵喵编程语言(MeowLang)。比如下面就是一段计算 A+B 的代码:

MiaoMiaoMiaoMiaoMiaoMiaoMiaoMiao; MiaoMiaoMiaoMiaoMiao;
;MiaoMiaoMiao;MiaoMiao;

MiaoMiaoMiaoMiao; MiaoMiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiao; MiaoMiao;
MiaoMiaoMiao;

MiaoMiaoMiaoMiao; MiaoMiao;
Miao;
MiaoMiaoMiao;

这个程序可以输出第二行的两段 Miao 的数量之和个猫猫表情,可以在 Meowlang Interpreter、或者使用下面的 C++ 解释器测试运行这段代码。

请你写一段 C++ 代码,实现输入输出一个喵喵程序代码,保证运行后可以一共输出 nn 个猫猫表情。

喵喵编程语言参考手册

本题使用中文拼音语境下的喵喵编程语言,只能使用两种字符串:Miao;,所有这两种字符串之间的多余空格和换行都将被忽略。

对应到整数列表

一段喵喵编程语言的代码可以包含多条语句,每条语句都包含若干个 Miao 且以 ; 结尾。假设有 nn 条语句,则解释器会先计算出每条语句中 Miao 的数量,并得到一个包含 nn 个整数的列表 a0an1a_0\sim a_{n-1}

比如下面这段代码对应的列表初始为:[0,1,2,4,3]

;Meow;Meow Meow;Meow Meow Meow Meow;Meow Meow Meow;

程序运行

程序运行时有下面几种变量:

  • IP:当前执行的语句对应的列表下标,初始为 00,每次执行 E(IP) 对应的指令。
  • E(x):列表中下标为 x 的那一项的数字
  • T:当前列表末尾的的数字
  • NE(IP+1),即列表中下一项的数字。

指令集:

指令 名称 描述 IP 变化
00 RET 换行 打印一个换行符 IP++
11 MEOW 输出 T 个喵
22 PUSH 压入 在列表末尾添加一项,添加的数字为 N IP+=2
33 POP 弹出 删除列表末尾 IP++
44 LOAD 载入 E(N) 压入列表末尾 IP+=2
55 SAVE 储存 E(N) 修改为列表末尾的元素的值
66 ADD 加法 把列表末尾两项相加,弹出末尾两项,然后把和压入列表末尾 IP++
77 SUB 减法 计算列表倒数第二项减去最后一项的差,弹出末尾两项,
把差压入队列末尾,如果差为负数,会压入 0
88 JMP 跳转 IP 设置为 N IP=N
99 JE 比较 如果列表最后一项是 00,将 IP 设置为 N
否则设置为 IP+2
IP = (T == 0)
? N : IP + 2
10\ge 10 NOP 跳过 跳过当前指令 IP++

本题规定

  • 程序中的 Miao 一共不能超过 10410^4 个。
  • 任意时刻列表总长度都不能超过 10001000
  • 涉及到 NE(x)、末尾两项的操作,必须存在对应项。
  • 最多只能执行 10610^6 次指令。
  • IP 超过列表范围时停止程序。

详细请看下面 C++ 解释器中的代码。

C++ 解释器

为了更好理解喵喵编程语言,我用 C++ 写了一个语言解释器,这个代码中准确描述了本题规则,你的代码输出的程序就会使用类似这个解释器的方式运行,看看能否输出 nn 个喵。

  • 喵喵语言解释器:miao.cpp
  • 斐波那契数列算法的喵喵语言代码:miao.txt

输入格式

输入一个整数 nn

输出格式

输出一段喵喵语言的代码,要求那个代码会无换行的输出 nn 个喵。

5
MiaoMiaoMiaoMiaoMiaoMiaoMiaoMiao; MiaoMiaoMiaoMiaoMiao;
;MiaoMiaoMiao;MiaoMiao;

MiaoMiaoMiaoMiao; MiaoMiaoMiao;
MiaoMiaoMiaoMiao; MiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiaoMiao;
MiaoMiaoMiaoMiaoMiao; MiaoMiao;
MiaoMiaoMiao;

MiaoMiaoMiaoMiao; MiaoMiao;
Miao;
MiaoMiaoMiao;

这是题目给的 a+b 的代码。执行过程如下

初始列表如下
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
列表:8 5 0 3 2 4 3 4 4 6 5  2  3  4  2  1  3

IP = 0,执行 JMP,跳转到 IP = 5
IP = 5,执行 LOAD,N=E[6]=3,把 E[N]=E[3]=3 压入列表末尾,IP+=2
IP = 7,执行 LOAD,N=E[8]=4,把 E[N]=E[4]=2 压入队列末尾,IP+=2
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
列表:8 5 0 3 2 4 3 4 4 6 5  2  3  4  2  1  3  3  2

IP = 9,执行 ADD,把末尾两项相加,IP++
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
列表:8 5 0 3 2 4 3 4 4 6 5  2  3  4  2  1  3  5

IP = 10,执行 SAVE,N=E[11]=2,把末尾 5 存入 E[N] 即 E[2],IP+=2
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
列表:8 5 5 3 2 4 3 4 4 6 5  2  3  4  2  1  3  5

IP = 12,执行 POP 去掉列表末尾,IP++
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
列表:8 5 5 3 2 4 3 4 4 6 5  2  3  4  2  1  3

IP = 13,执行 LOAD,N=E[14]=2,把 E[N]=E[2]=5 压入列表末尾,IP+=2
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
列表:8 5 5 3 2 4 3 4 4 6 5  2  3  4  2  1  3  5

IP = 15,执行 MEOW,喵列表末尾那么多下,输出了 5 个喵,IP++
IP = 16,执行 POP,弹出列表末尾,IP++
下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
列表:8 5 5 3 2 4 3 4 4 6 5  2  3  4  2  1  3

IP = 17 结束。

显然其实在算完 ADD 之后直接 MEOW 然后结束就好了。或者直接末尾放五个 Miao,然后开头 MEOW 完直接跳转到列表外结束即可。

数据规模与约定

对于 100%100\% 的数据,1n1061 \le n \le 10^6

  • 子任务 1(10 分):保证 n=1n=1
  • 子任务 2(20 分):保证 n100n\le 100
  • 子任务 3(30 分):保证 n1000n\le 1000
  • 子任务 4(40 分):没有特殊限制。

挖土机 CSP-J 模拟赛 ~ 第十六场

未参加
状态
已结束
规则
OI
题目
4
开始于
2024-10-24 4:00
结束于
2024-10-25 16:00
持续时间
3.5 小时
主持人
参赛人数
82