#P1768. Hang or not to hang

Hang or not to hang

本题没有可用的提交语言。

描述

小汤姆正在学习编程。他刚写了一些程序,但不敢运行,因为他不确定这些程序是否会终止。请编写一个程序来帮他解决这个问题。这项任务可不简单,因为汤姆写的程序可能是不确定的。给定汤姆编写的程序,你的程序需要判断该程序是否能够终止,如果能,还需算出它终止前最短的运行时间。

汤姆的计算机有 32 个 1 位寄存器,程序由 nn 条指令组成。寄存器编号从 0 到 31,指令编号从 0 到 n1n - 1

下面,MEM[a]MEM[a] 表示第 aa 个寄存器的内容,其中 0a,b<320 \leq a, b < 320x<n0 \leq x < n0c10 \leq c \leq 1

指令集如下:

指令 语义
AND a b MEM[a]:=MEM[a]MEM[a] := MEM[a]MEM[b]MEM[b]
OR a b MEM[a]:=MEM[a]MEM[a] := MEM[a]MEM[b]MEM[b]
XOR a b MEM[a]:=MEM[a]MEM[a] := MEM[a] 异或 MEM[b]MEM[b]
NOT a MEM[a]:=MEM[a] :=MEM[a]MEM[a]
MOV a b MEM[a]:=MEM[b]MEM[a] := MEM[b]
SET a c MEM[a]:=cMEM[a] := c
RANDOM a MEM[a]:=MEM[a] := 随机值(0 或 1)
JMP x 跳转到编号为 xx 的指令
JZ x a MEM[a]=0MEM[a] = 0,则跳转到编号为 xx 的指令
STOP 停止程序

程序的最后一条指令始终是 STOP(不过可能存在多条 STOP 指令)。每个程序都从编号为 0 的指令开始执行。程序开始前,寄存器的内容可以是任意值。每条指令(包括 STOP)的执行都需要 1 个处理器周期。

任务

编写一个程序,该程序需要:

  1. 读取程序内容。
  2. 计算程序最短的可能运行时间。
  3. 输出计算结果。

输入

输入的第一行包含一个整数 nn1n161 \leq n \leq 16),表示程序的指令数量。接下来的 nn 行,每行包含一条按上述格式编写的程序指令。你可以假定程序中唯一的空白字符是每条指令中连续标记之间的单个空格。

输出

输出的第一行也是唯一一行应包含程序最短的可能运行时间,以处理器周期为单位。如果程序无法终止,输出应包含单词 HANGS

输入数据 1

5
SET 0 1
JZ 4 0
RANDOM 0
JMP 1
STOP

输出数据 1

6

来源

2003 年中欧竞赛