布尔可满足性问题(SAT)是计算机科学中一个非常著名且困难的问题。在本题中,给定一个布尔公式,你需要判断是否能为公式中的变量赋予 true 或 false 的值,使得整个公式的值为 true。
SAT 是一个 NP 完全问题。即使对于 3-CNF 公式(3-SAT),它仍然是 NP 完全的。然而,例如 2-CNF 公式(2-SAT)的 SAT 问题则属于 P 类问题。
#SAT 问题
SAT 是 SAT 问题的扩展。在本题中,你需要计算有多少种变量赋值方式使得公式的值为 true。即使对于 2-CNF 公式,该问题也被证明是 #P 完全的。我们要求你解决 #1-DNF-SAT 问题,即 1-DNF 公式的 #SAT 问题。
给定一个 1-DNF 形式的布尔公式。这意味着它是一个或多个子句的析取(逻辑或),每个子句恰好是一个文字,每个文字要么是一个变量,要么是一个变量的否定(逻辑非)。
形式化定义如下:
$$\langle \text{formula} \rangle ::= \langle \text{clause} \rangle \mid \langle \text{formula} \rangle \lor \langle \text{clause} \rangle$$ $$\langle \text{clause} \rangle ::= \langle \text{literal} \rangle$$ $$\langle \text{literal} \rangle ::= \langle \text{variable} \rangle \mid \neg \langle \text{variable} \rangle$$ $$\langle \text{variable} \rangle ::= A \dots Z \mid a \dots z$$
你的任务是计算有多少种方式将所有变量替换为 true 和 false(同一变量的所有出现必须替换为相同的值),使得公式的值为 true。
输入格式
输入文件的唯一一行包含一个 1-DNF 形式的逻辑公式(长度不超过 1000 个字符)。逻辑运算由 |(析取)和 ~(否定)表示。变量为 A ... Z 和 a ... z(大小写字母代表不同的变量)。公式中不包含空格或其他语法未提及的字符。
输出格式
输出一个整数,即给定公式的 #SAT 问题答案。
样例
输入格式 1
a
输出格式 1
1
输入格式 2
B|~B
输出格式 2
2
输入格式 3
c|~C
输出格式 3
3
输入格式 4
i|c|p|c
输出格式 4
7