QOJ.ac

QOJ

時間限制: 2.0 s 記憶體限制: 256 MB 總分: 100

#12749. 组合子表达式

统计

组合逻辑可以被视为一种计算模型,它允许将任何可计算函数表示为来自一个小有限基的函数的组合。在本题中,我们考虑 BCKW 基的一个受限变体:BCKI。

BCKI 基中的组合子表达式是一个字符串,符合以下文法:

$\langle \text{Expression} \rangle ::= \langle \text{Expression} \rangle \langle \text{Term} \rangle \mid \langle \text{Term} \rangle$ $\langle \text{Term} \rangle ::= \text{‘(’} \langle \text{Expression} \rangle \text{‘)’} \mid \text{‘B’} \mid \text{‘C’} \mid \text{‘K’} \mid \text{‘I’}$

从文法中可以看出,表达式是一棵应用树,其叶子节点是组合子 $B$、$C$、$K$ 和 $I$。应用是左结合的。例如,$BIC$ 等价于 $(BI)C$,而不等价于 $B(IC)$。

为了便于解释,我们使用小写英文字母 ($a \dots z$) 来表示子表达式。这些小写字母不会出现在实际数据中。例如,$BIC$ 可以表示为 $BxC$(即 $BIx$ $C$)、$x$ ($BIC$ $x$)、$xy$ ($BI$ $x$ $C$ $y$)、$Bxy$ ($BIx$ $C$ $y$),但不能表示为 $Bx$。

我们称在表达式 $pq$ 中,我们将 $p$ 应用于 $q$。我们可以凭直觉说 $p$ 是一个函数,而 $q$ 是它的参数。然而,求值过程与传统计算完全不同——我们不是在固定的表达式树上传递值,而是通过改变树的结构来进行求值,使得结果也是某种组合子表达式。

为了对表达式求值,我们需要选择某个子表达式,使其对应下表中的某种模式——也就是说,存在某个 $x$(可能还有 $y$ 和 $z$),使得表中的模式与该子表达式相等。然后,我们需要用表中的归约结果替换该子表达式。

模式 归约结果 描述
$Bxyz$ $x(yz)$ 组合函数 (Composition function)
$Cxyz$ $(xz)y$ 交换函数 (Exchange function)
$Kxy$ $x$ 常数函数 (Constant function)
$Ix$ $x$ 恒等函数 (Identity function)

在完成替换后,我们必须重复此过程,直到不再存在合适的子表达式为止。这个最终表达式即为原表达式的范式(normal form)。

正如你所见,归约的次数可能因求值顺序不同而不同。这提出了一个有趣的问题:对于给定的公式,找到一种归约次数最少的求值顺序。

你的任务是编写一个程序,计算将给定的组合子表达式归约到其范式所需的最少归约次数。

输入格式

输入文件的唯一一行包含一个符合上述文法的组合子表达式。表达式的长度不超过 $30\,000$。表达式不包含空格或文法中未指定的符号。

输出格式

输出一个整数——将给定的公式归约到范式所需的最少归约次数。

样例

样例 1

C(K(II)(IC))
2

样例 2

CIBI
3

样例 3

BBBBBCCCCCKKKKKIIIII
15

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.