#P10619. [ICPC 2013 WF] Harvard

[ICPC 2013 WF] Harvard

Description

“哈佛架构”一词适用于指令和数据具有物理上分开的存储器的计算机。该术语起源于哈佛 Mark I 计算机,由 IBM 于 1944 年交付,该计算机使用纸带作为指令,使用继电器作为数据。

一些现代微控制器使用哈佛架构——但不使用纸带和继电器!数据存储器被组织成多个存储区(bank),每个存储区包含相同数量的数据项。每条引用数据的指令都有一个字节偏移量 ff 和一个位 aa,用于选择要引用的存储区。如果 aa00,则引用存储区 00。如果 aa11,则在存储区选择寄存器(BSR)中的值标识要使用的存储区。假设每条指令执行时间相同,并且存在可以设置 BSR 值的指令。

例如,假设有 44 个存储区,每个存储区有 88 个字节。要访问位置 55,可以使用 a=0a = 0f=5f = 5 的单条指令,或者在一条指令中将 BSR 设置为 00,然后使用 a=1a = 1f=5f = 5 的指令。第一种方法更快,因为它不需要设置 BSR。

现在假设(使用相同的存储器)要访问的位置是 2020。这里只能使用一种方法:执行一条指令将 BSR 设置为 22(除非 BSR 已经是 22),然后使用 a=1a = 1f=4f = 4 的指令。

程序是操作的序列。每个操作可以是

  • 变量引用,写作 Vii,其中 ii 是正整数,或
  • 重复,写作 Rnn <program> E,其中 nn 是正整数,<program> 是任意程序。此操作相当于 <program> 的 n 次连续出现。

你的任务是确定程序的最小运行时间。具体来说,给定内存存储区的数量和大小以及要执行的程序,找出必须执行的最小指令数(引用内存位置和可能设置 BSR),以运行程序。为此,你必须确定将变量映射到存储区的方式,以产生最小的执行时间,并报告该执行时间——即完成程序所需的内存引用和 BSR 寄存器设置的数量。BSR 的值最初未定义,仅在指令显式设置其值时更改。

Input Format

输入包含一个测试用例。测试用例包含两行。第一行包含两个整数 bbss,其中 1b131 \leq b \leq 13 是存储区的数量,1s131 \leq s \leq 13 是每个存储区可以存储的变量数。第二行包含一个非空程序,最多包含 10001 000 个用空格分隔的元素(每个 Rnn, Vii 和 E 都算作一个元素)。

你可以假设以下几点:

  • 在重复 Rnn 中,重复次数满足 1n1061 \leq n \leq 10^6
  • 在循环操作 Rnn <program> E 中,循环体 <program> 不为空。
  • 在变量引用 Vii 中,变量索引满足 1imin(b×s,13)1 \leq i \leq \min(b \times s, 13)
  • 程序执行的总变量引用数最多为 101210^{12}

Output Format

显示完成程序所需执行的最小指令数。

翻译来自于:ChatGPT

1 2
V1 V2 V1 V1 V2
5
2 1
V1 V2 V1 V1 V2
6
1 2
R10 V1 V2 V1 E
30
4 1
V1 R2 V2 V4 R2 V1 E V3 E
17