논리식을 참으로 만드는 할당의 개수

아직 제출이 없습니다시간 제한2초메모리 제한256 MB

문제

입력으로 하나의 논리식이 주어진다. 논리식은 입력 변수 A부터 L까지, 상수 01, 그리고 동치(⇔), 함의(→), 논리합(∨), 논리곱(∧), 부정(¬) 연산자로 이루어지며 다음 문법을 따른다.

<expression>  ::= { <implication> ⇔ }* <implication>
<implication> ::= <disjunction> | <disjunction> → <implication>
<disjunction> ::= <conjunction> | <disjunction> ∨ <conjunction>
<conjunction> ::= <term> | <conjunction> ∧ <term>
<term>        ::= A ... L | 0 | 1 | ¬ <term> | ( <expression> )

여기서 {X}*X를 0번 이상 반복함을 뜻한다. 연산자 우선순위는 낮은 것부터 높은 것 순으로 동치, 함의, 논리합, 논리곱, 부정이며, 함의(→)는 오른쪽 결합(right-associative)이다.

각 연산의 의미는 일반적인 정의를 따르되 동치만 예외이다. 한 식 안에서 나란히 이어진 여러 개의 동치 a1a2aka_1 \Leftrightarrow a_2 \Leftrightarrow \cdots \Leftrightarrow a_k는 모든 인자의 값이 서로 같을 때에만 1이고, 그렇지 않으면 0이다.

12개의 변수 A부터 L까지에 각각 0 또는 1을 대입하는 방법은 모두 212=40962^{12} = 4096가지가 있다. 이 4096가지 대입 중에서 논리식의 값이 1이 되는 경우의 수를 구하라.

입력

첫 번째 줄에 논리식이 주어진다. 논리식의 길이는 최대 300,000자이다. 동치는 <=>, 함의는 ->, 논리합은 |, 논리곱은 &, 부정은 ~로 표기한다. 변수 A~L과 상수 0, 1은 그대로 쓴다. 논리식에는 공백이나 문법에 없는 다른 문자가 포함되지 않는다.

출력

12개의 변수 A부터 L까지에 대한 212=40962^{12} = 4096가지 대입 중에서, 논리식의 값이 1이 되는 대입의 개수를 정수 하나로 출력한다. 식에 등장하지 않는 변수도 0 또는 1을 자유롭게 가질 수 있으므로 개수에 포함된다.

힌트

우선순위 때문에 B&C|E(B&C)|E로 해석된다. 또한 F<=>(F)<=>F처럼 같은 값이 동치로 나란히 이어지면 세 인자가 항상 서로 같으므로 값은 언제나 1이다. 함의는 오른쪽 결합이므로 A->B->CA->(B->C)와 같다.