组合逻辑可以被视为一种计算模型,它允许将任何可计算函数表示为来自一个小有限基的函数的组合。在本题中,我们考虑 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