QOJ.ac

QOJ

Limite de temps : 1.0 s Limite de mémoire : 256 MB Points totaux : 100

#15768. 项生成器

Statistiques

一个表达式(formula)的语法如图 1(a) 所示。如果一个表达式满足图 1(b) 所示的特定语法,我们称该表达式处于范式(Normal Form, 简称 NF)

<formula> ::= <variable> | (+<formulae>) | (*<formulae>)
<variable> ::= 英文字母中的一个小写字母
<formulae> ::= <formula> | <formula><formulae>
a) 表达式的一般语法
<NF_formula> ::= <term> | (+<terms>)
<term> ::= <variable> | (*<variables>)
<terms> ::= <term><term> | <term><terms>
<variables> ::= <variable><variable> | <variable><variables>
b) 范式(NF)表达式的语法
图 1. 表达式语法

一个表达式可以根据以下重写规则转换为范式(NF),其中 $F$ 代表一个表达式,$S$ 代表一个非空的表达式序列,$s$ 和 $s'$ 代表可能为空的表达式序列。在表达式 $F$ 上应用一条重写规则 $q \to r$ 意味着将 $F$ 中匹配模式 $q$ 的部分替换为 $r$,转换过程如图 2 所示。当无法再应用任何重写规则时,转换终止。对于任何表达式,转换过程都会终止,且无论在表达式的哪些部分以何种顺序应用规则,最终得到的结果都是唯一的。

  1. (+F) -> F
  2. (*F) -> F
  3. (+s(+S)s') -> (+sSs')
  4. (*s(*S)s') -> (*sSs')
  5. (*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))
图 2. 将表达式转换为范式(NF)

令 $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)}$,其中的项依次为 xyy
  • $k_1 = -2$:生成前 2 个项 xy,但不打印。
  • $k_2 = 1$:生成第 3 个项 y 并打印。
  • 最后以 $0$ 结束。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.