你需要破解一个基于二进制数字的加密等式。
原始等式仅由二进制数字(“0”和“1”)、运算符(“+”、“-”、“*”)、括号(“(”和“)”)以及等号(“=”)组成。加密过程将原始算术等式中的某些字符替换为字母。如果一个字符被替换,则其所有出现的位置都会被同一个字母替换。两个不同的字符绝不会被替换为同一个字母。注意,加密并不总是替换同一个字符的所有出现位置;某些出现位置可能被替换,而另一些可能保持原样。某些字符可能根本没有被替换。罗马字母表中的任何大小写字母都可以用作替换字母。注意,大小写是敏感的,即“a”和“A”是不同的字母。不仅数字,运算符、括号甚至等号都可能被替换。
算术等式由以下上下文无关文法的起始符号 $Q$ 导出:
$$ \begin{aligned} Q &::= E=E \\ E &::= T \mid E+T \mid E-T \\ T &::= F \mid T*F \\ F &::= N \mid -F \mid (E) \\ N &::= 0 \mid 1B \\ B &::= \varepsilon \mid 0B \mid 1B \end{aligned} $$
此处,$\varepsilon$ 表示空。
如该文法所示,算术等式应包含一个等号。等式的每一侧都是一个由数字、加法、减法、乘法和取反组成的表达式。乘法的优先级高于加法和减法,而取反的优先级高于乘法。乘法、加法和减法是左结合的。例如,$x-y+z$ 表示 $(x-y)+z$,而不是 $x-(y+z)$。数字采用二进制表示,由二进制数字 0 和 1 组成。多位数字总是以 1 开头。括号和取反符号在等式中可能冗余出现,例如 $((--x+y))+z$。
编写一个程序,对于给定的加密等式,计算出有多少种不同的原始正确等式。在此,等式必须符合上述文法,并且当等式两边的计算值相等时,该等式是正确的。
输入格式
输入包含一个测试用例,为一个由罗马字母、二进制数字、运算符、括号和等号组成的字符串。输入字符串长度不超过 31 个字符。
输出格式
在一行中输出可以加密为该输入字符串的正确等式的数量。
样例
样例输入 1
ACM
样例输出 1
0
样例输入 2
icpc
样例输出 2
1
样例输入 3
BAYL0R
样例输出 3
3
样例输入 4
-AB+AC-A
样例输出 4
1
样例输入 5
abcdefghi
样例输出 5
0
样例输入 6
111-10=1+10*10
样例输出 6
1
样例输入 7
0=10-1
样例输出 7
0
说明
对于样例 1,C 必须是 =,因为任何等式在两个表达式之间都有一个 =。由于 A 和 M 必须不同,尽管存在符合文法的等式,但没有一个是正确的。
对于样例 2,唯一可能的正确等式是 -0=0。
对于样例 3 (B-A-Y-L-zero-R),有三个不同的正确等式:0=-(0),0=(-0) 和 -0=(0)。注意,其中一个 0 在加密等式中没有被替换为字母。