#P7062. [NWRRC 2014] Combinator Expression

[NWRRC 2014] Combinator Expression

Description

题目背景

组合逻辑可以看作是一种计算模型,允许将任何可计算函数表示为从小的有限基底中选取的函数的组合。在这个问题中,我们考虑 BCKW 基底的一个受限变体,即 BCKI。

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

⟨表达式⟩ ::= ⟨表达式⟩ ⟨项⟩ | ⟨项⟩
⟨项⟩ ::= ‘(’⟨表达式⟩‘)’ | ‘B’ | ‘C’ | ‘K’ | ‘I’

从文法可以看出,表达式是应用树,叶子是组合子 B,C,KB, C, KII。应用是左结合的。例如,BICBIC 等价于 (BI)C(BI)C,但不等价于 B(IC)B(IC)

为了便于解释,我们将使用小写英文字母 (az)(a \cdots z) 来表示子表达式。这些小写字母不会出现在实际数据中。例如,BICBIC 可以表示为 BxCBxC(即 BIxCB\underbrace { I }_{ x }C),x(BICx)x(\underbrace {BIC}_{ x })xy(BIxCy)xy(\underbrace {BI}_{ x } \underbrace { C }_{ y }),$Bxy (B\underbrace { I }_{ x }\underbrace { C }_{ y })$,但不能表示为 BxBx

在表达式 pqpq 中,我们说将 pp 应用于 qq。我们可以用直觉来理解,pp 是一个函数,而 qq 是它的参数。然而,求值过程与传统的计算非常不同——不是通过固定表达式树传递值,而是通过改变树结构,使得结果也是一个组合表达式。

为了求值一个表达式,我们需要选择一个子表达式,该子表达式应符合下表中的某个模式——也就是说,应该存在这样的 xx(可能还有 yyzz),使得表中的模式与子表达式相等。然后我们需要将子表达式替换为表中的简化结果。

模式 简化结果 描述
BxyzBxyz x(yz)x(yz) 组合函数(Zusammensetzungsfunktion)
CxyzCxyz (xz)y(xz)y 交换函数(Vertauschungsfunktion)
KxyKxy xx 常数函数(Konstanzfunktion)
IxIx 恒等函数(Identitätsfunktion)

替换完成后,我们必须重复这个过程,直到没有合适的子表达式为止。这个最终表达式就是原始表达式的规范形式。例如,在表达式 CIC(CB)ICIC(CB)I 中,我们可以进行如下字母分配

$$\underbrace { C }_{ C }\underbrace { I }_{ x }\underbrace { C }_{ y }\underbrace {(CB)}_{ z }I$$

并看到 CIC(CB)I(((CI)C)(CB))I(((Cx)y)z)ICIC(CB)I ≡ (((CI)C)(CB))I ≡ (((Cx)y)z)I 包含了 CC 组合子模式,因此简化为 ((xz)y)II(CB)CI:((xz)y)I ≡ I(CB)CI:

$$(\underbrace { C }_{ C }\underbrace { I }_{ x }\underbrace { C }_{ y }\underbrace { (CB) }_{ Z })I \rightarrow (\underbrace { I }_{ x } \underbrace {(CB)}_{ z }\underbrace { C }_{ y })I$$

另一个例子:B((CK)I)ICB((CK)I)IC 表达式。让我们先简化组合子 B:B:

$$(\underbrace { B }_{ B }\underbrace { ((CK)I) }_{ x }\underbrace { I }_{ y }\underbrace { C }_{ z } \rightarrow \underbrace { ((CK)I) }_{ x } (\underbrace { I }_{ y }\underbrace { C }_{ z }))$$

现在,让我们简化最后一个 I:I:

$$((CK)I)(\underbrace { I }_{ I } \underbrace { C }_{ x }) \rightarrow ((CK)I)C$$

最后,我们通过两次更多的简化完成求值:

$$((\underbrace { C }_{ C }\underbrace { K }_{ x }) \underbrace { I }_{ y }) \underbrace { C }_{ z } \rightarrow (\underbrace { K }_{ K }\underbrace { C }_{ x }) \underbrace { I }_{ y } \rightarrow C$$

可以证明,无论求值顺序如何,规范形式都是一样的。例如,以下求值顺序:

$$C(K(II)(\underbrace { I }_{ I }\underbrace { C }_{ x })) \rightarrow C(K(\underbrace { I }_{ I }\underbrace { I}_{ x })(C)) \rightarrow C((\underbrace { K }_{ K }\underbrace { I }_{ x }) \underbrace { C }_{ y }) \rightarrow CI$$

$$C(K(\underbrace {I}_{ I }\underbrace { I }_{ x })(IC)) \rightarrow C((\underbrace { K }_{ K }\underbrace { I }_{ x })\underbrace { (IC)}_{ y }) \rightarrow CI$$

得到的结果相同。然而,如你所见,简化的次数不同:第一个情况下为 33 次,第二个情况下为 22 次。这提出了一个有趣的问题——找到一个给定公式所需的最小简化次数。

你的任务是编写一个程序,找到给定组合表达式求值到其规范形式所需的最小简化次数。

Input Format

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

Output Format

输出一个整数——给定公式求值到规范形式所需的最小简化次数。

C(K(II)(IC))

2

CIBI

3

BBBBBCCCCCKKKKKIIIII

15

Hint

时间限制:1 秒,内存限制:256 MB。