시간 제한
메모리 제한
시간 제한
1초
메모리 제한
128 MB
논리식은 참 또는 거짓 값을 다루는 식이다. 이 문제의 논리식은 다음 요소로 이루어진다.
true 또는 false 값을 가지는 변수
하나의 피연산자를 받는 단항 논리 연산자
두 개의 피연산자를 받는 이항 논리 연산자
계산 순서를 정하는 괄호
각 논리 연산자는 진리표로 정의된다. 단항 연산자의 진리표는 피연산자가 false일 때의 결과와 true일 때의 결과를 이 순서로 담는다. 이항 연산자의 진리표는 두 줄로 주어지며, 첫 번째 줄은 왼쪽 피연산자가 false일 때, 두 번째 줄은 왼쪽 피연산자가 true일 때를 뜻한다. 각 줄의 두 값은 오른쪽 피연산자가 false, true일 때의 결과이다.
논리식의 문법은 다음과 같다.
<expression> = <variable> | ( <expression> <operator> <expression> ) | ( <operator> <expression> )<variable> = <lowercase_letter><operator> = <uppercase_letter> | <operator> <uppercase_letter>여기서 |는 문법에서 선택을 나타내는 기호일 뿐, 실제 논리식에는 등장하지 않는다. <lowercase_letter>는 영어 소문자 하나이고, <uppercase_letter>는 영어 대문자 하나이다.
일부 변수의 값만 주어져도 논리식의 결과가 정해질 수 있다. 아직 값이 주어지지 않은 변수들에 가능한 모든 참/거짓 값을 대입했을 때 결과가 모두 true이면 식의 값은 true이고, 모두 false이면 false이다. 두 결과가 모두 가능하면 식의 값은 unknown이다.
입력은 하나 이상의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫 줄에는 100 이하의 음이 아닌 정수 두 개가 주어진다. 첫 번째 정수는 단항 연산자의 개수, 두 번째 정수는 이항 연산자의 개수이다.
이후 연산자의 이름과 진리표가 주어진다. 모든 연산자 이름의 길이는 20 이하이며, 한 테스트 케이스 안에서 서로 다르다.
각 단항 연산자는 두 줄로 정의된다. 첫 줄에는 연산자 이름이, 둘째 줄에는 두 개의 참/거짓 값이 주어진다. 두 값은 피연산자가 false, true일 때의 결과이다.
각 이항 연산자는 세 줄로 정의된다. 첫 줄에는 연산자 이름이, 다음 두 줄에는 각각 두 개의 참/거짓 값이 주어진다. 첫 번째 줄은 왼쪽 피연산자가 false일 때, 두 번째 줄은 왼쪽 피연산자가 true일 때를 나타내며, 각 줄의 두 값은 오른쪽 피연산자가 false, true일 때의 결과이다.
모든 연산자 정의 뒤에는 위 문법을 만족하는 논리식 한 줄이 주어진다. 변수와 연산자는 하나 이상의 공백으로 구분된다. 괄호로 묶인 식과 인접한 연산자 사이에는 공백이 있을 수도 있고 없을 수도 있다. 같은 변수는 논리식에 두 번 이상 등장하지 않으며, 논리식의 길이는 1 이상 500 이하이다.
논리식 다음에는 0개 이상의 변수 값이 한 줄에 하나씩 주어진다.
<variable> true<variable> false같은 변수 값은 두 번 이상 주어지지 않는다. 각 테스트 케이스는 * 한 줄로 끝난다. 입력의 끝에는 음의 정수 두 개가 한 줄로 주어진다.
각 테스트 케이스마다 한 줄에 Case k: result 형식으로 출력한다. k는 1부터 시작하는 테스트 케이스 번호이고, result는 true, false, unknown 중 하나이다.
<expression> = <variable> | ( <expression> <operator> <expression> ) | ( <operator> <expression> )<variable> = <lowercase_letter><operator> = <uppercase_letter> | <operator> <uppercase_letter><variable> true<variable> false