아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

가장 짧은 논리식

시간 제한1초메모리 제한256 MB

요약
x, y, z 변수와 &, |, ! 연산자로 이루어진 완전히 괄호화된 불리언 식과 동등한 가장 짧은 식의 길이를 공백을 제외하고 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 완전 탐색, 비트 연산
정답자
아직 제출이 없습니다

문제

닐스는 석사 논문을 준비하면서 자신이 만든 로그 시간 정지 문제 해결기의 소스 코드를 논문에 싣고 싶어 한다. 이 논문이 전 세계에서 수백만 부 인쇄될 것은 확실하므로, 환경에 주는 부담을 줄이려고 프로그램을 최대한 짧게 쓰려고 한다.

닐스를 도와 불 대수식을 최적화하는 프로그램을 작성하자. 입력으로는 괄호가 빠짐없이 붙은 식이 주어지고, 식은 한 글자짜리 연산자 &, |, ! 를 쓴다.

식마다 그 식과 논리적으로 같은 식 중 가장 짧은 것의 길이를 출력한다. 길이를 셀 때 공백은 세지 않는다.

expression ::= variable
             | '(' expression ' ' operator ' ' expression ')'
             | '!' expression
operator ::= '&' | '|'
variable ::= 'x' | 'y' | 'z'

이항 연산자에는 괄호가 반드시 붙는다. 그래서 이항 연산자 하나는 길이에 3을 더하고, ! 하나와 변수 하나는 각각 길이에 1을 더한다.

입력

첫째 줄에 테스트 케이스의 개수 nn이 주어진다 (1≤n≤501 \le n \le 50). 다음 nn개 줄에는 위 문법을 따르는 식이 한 줄에 하나씩 주어진다. 각 식의 길이는 공백을 포함해 500자를 넘지 않는다.

출력

테스트 케이스마다 같은 값을 내는 식 중 가장 짧은 것의 길이를 한 줄에 하나씩 출력한다.

힌트

첫 번째 예제의 식은 항상 거짓이다. 이 식은 (x & !x)로 쓸 수 있고, 길이는 6이다. 세 번째 예제는 드모르간 법칙을 두 번 적용하면 두 번째 예제와 같은 식이 된다.

예제3

  1. 예제 1

    입력
    3
    (((x & !y) & (y & !z)) & (z & !x))
    ((x & z) | (y & z))
    !((!x & !y) | !z)
    
    예상 출력
    6
    9
    9
    
  2. 예제 2

    입력
    5
    x
    !x
    !!x
    !!!x
    !!!!x
    
    예상 출력
    1
    2
    1
    2
    1
    
  3. 예제 3

    입력
    6
    (x & !x)
    (x | !x)
    (y | (x & !x))
    ((x | !x) & z)
    (x & x)
    (x | x)
    
    예상 출력
    6
    6
    1
    1
    1
    1