一个表达式(formula)的语法如图 1(a) 所示。如果一个表达式满足图 1(b) 所示的特定语法,我们称该表达式处于范式(Normal Form, 简称 NF)。
<formula> ::= <variable> | (+<formulae>) | (*<formulae>) <variable> ::= 英文字母中的一个小写字母 <formulae> ::= <formula> | <formula><formulae>
<NF_formula> ::= <term> | (+<terms>) <term> ::= <variable> | (*<variables>) <terms> ::= <term><term> | <term><terms> <variables> ::= <variable><variable> | <variable><variables>
一个表达式可以根据以下重写规则转换为范式(NF),其中 $F$ 代表一个表达式,$S$ 代表一个非空的表达式序列,$s$ 和 $s'$ 代表可能为空的表达式序列。在表达式 $F$ 上应用一条重写规则 $q \to r$ 意味着将 $F$ 中匹配模式 $q$ 的部分替换为 $r$,转换过程如图 2 所示。当无法再应用任何重写规则时,转换终止。对于任何表达式,转换过程都会终止,且无论在表达式的哪些部分以何种顺序应用规则,最终得到的结果都是唯一的。
(+F) -> F(*F) -> F(+s(+S)s') -> (+sSs')(*s(*S)s') -> (*sSs')(*s(+FS)s') -> (+(*sFs')(*s(+S)s'))
(+(*(+(*ab)(+a))b)) -1-> (+(*(+(*ab)a)b)) -5-> (+(+(*(*ab)b)(*(+a)b))) -1-> (+(+(*(*ab)b)(*ab))) -4-> (+(+(*abb)(*ab))) -1-> (+(*abb)(*ab))
令 $NF(F)$ 为表达式 $F$ 的范式。本题的任务是编写一个项生成器(term generator),对于给定的表达式 $F$ 和数量 $k$,按它们在 $NF(F)$ 中出现的顺序输出 $NF(F)$ 中的后 $k$ 个项(term)。如果项已被全部输出(即到达末尾),生成器将循环从 $NF(F)$ 的第一个项重新开始生成。
例如,考虑 $F = \texttt{(+(*(+(*ab)(+a))b))}$,其范式为 $NF(F) = \texttt{(+(*abb)(*ab))}$,如图 2 所示。从 $NF(F)$ 中生成第 1 个项得到 (*abb)。再生成 2 个项将得到 (*ab) 和 (*abb)。请注意,如果 $NF(F)$ 包含相同的项(如样例 2 所示),这些项被视为是彼此独立的。
输入格式
输入包含多组测试数据,以文件结束符(EOF)结束。
每组测试数据的格式为: $$F \quad k_1 \quad k_2 \quad \dots \quad k_n \quad 0$$
其中 $n > 0$,$F$ 是一个表达式,$k_1 \dots k_n$ 是非零的长整型数(long integer),最后以 $0$ 结束。
输入中可以自由使用空格。
输出格式
对于每组测试数据中的每个 $k_i$($i = 1 \dots n$):
- 程序需要从 $NF(F)$ 中生成接下来的 $|k_i|$ 个项。
- 如果 $k_i > 0$,则将这些生成的项依次输出到标准输出,每个项独占一行,且项的字符之间没有空格。
- 如果 $k_i < 0$,则仅在内部生成 these 项(更新生成器的状态),但不进行打印。
数据范围
- 输入中的每个表达式 $F$ 最多包含 150 个字符。
- $NF(F)$ 的每个项(不计空格)长度最多为 80 个字符。
- 输入数据保证正确。
样例
输入格式 1
(+(*(+(*ab)(+a))b)) -3 1 1 0 (+xyy) -2 1 0
输出格式 1
(*ab) (*abb) y
说明
对于第二组样例 (+xyy) -2 1 0:
- $NF(F) = \texttt{(+xyy)}$,其中的项依次为
x、y、y。 - $k_1 = -2$:生成前 2 个项
x和y,但不打印。 - $k_2 = 1$:生成第 3 个项
y并打印。 - 最后以 $0$ 结束。