만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

도서 검색 프로그램

시간 제한3초메모리 제한1024 MB

요약
DB에 저장된 책 가운데 이름, 저자, 태그를 조건으로 한 중첩 검색식(A, O, N)을 모두 만족하는 책의 개수를 구합니다.
난이도

보통10점 중 4점

유형
재귀, 문자열, 구현
정답자
아직 제출이 없습니다

문제

게임개발동아리 PIMM에는 졸업생들이 전공책을 동아리방에 두고 가는 문화가 있다. 과거 PIMM은 신입 회원들이 중고 전공책을 자유롭게 쓸 수 있도록 도서 대여 시스템을 운영했다. 하지만 민규가 회장을 맡았던 작년에는 동아리방에 책이 너무 많이 쌓여 대여 시스템을 관리하기 어려워졌다. 이 소식을 들은 종현은 필요한 책을 바로 찾을 수 있는 도서 검색 프로그램을 만들기 시작했다.

종현이 만든 도서 검색 프로그램은 도서와 검색 요청을 각각 문자열로 저장한다. DB에는 도서를 뜻하는 문자열 <book>이 저장되며, 이 문자열은 배커스-나우르 표기법(BNF)에 따라 다음과 같이 표기될 수 있다. 표에서 "::=" 왼쪽에는 기호, 오른쪽에는 표현식이 온다.

<book> ::= <name> " " <author> | <name> " " <author> " " <tags>
<tags> ::= <tag> | <tag> " " <tags>
<name> ::= <str>
<author> ::= <str>
<tag> ::= <str>

이 표의 기호와 표현식은 다음과 같은 특성을 가진다.

  • <str>은 알파벳 대소문자, 숫자, '-', '_'로 이루어진 길이 2020 이하의 문자열이다.
  • <name>은 도서의 이름을 뜻한다.
  • <author>는 도서의 저자를 뜻한다.
  • <tag>는 도서가 가진 특징을 뜻한다.
  • 하나의 <tags> 안에 중복된 <tag>는 존재하지 않는다.

예를 들어 DB에 "1984 George_Orwell novel SF"라는 문자열 <book>이 있다면, 이름이 1984이고 저자가 George_Orwell이며 novel과 SF라는 두 가지 특징을 가진 도서가 검색 프로그램에 있다는 뜻이다.

DB에서 <name>과 <author>가 모두 같은 도서는 둘 이상 존재할 수 없다. 다만 <name>이나 <author> 중 하나만 같은 도서는 여러 권 있을 수 있다.

검색 요청 <search>도 문자열로 주어진다.

<method> ::= <AND> | <OR> | <NOT> | <nameCorrect> | <nameInclude> | <authorCorrect> | <tagCorrect>
<methods> ::= <method> | <method> ", " <methods>

<AND> ::= "A(" <methods> ")"
<OR> ::= "O(" <methods> ")"
<NOT> ::= "N(" <method> ")"

<nameCorrect> ::= "n:" <str>
<nameInclude> ::= "ni:" <str>
<authorCorrect> ::= "a:" <str>
<tagCorrect> ::= "t:" <str>

<search> ::= <methods>

이 표의 기호와 표현식은 다음과 같은 특성을 가진다.

  • <str>은 알파벳 대소문자, 숫자, '-', '_'로 이루어진 길이 2020 이하의 문자열이다.
  • <nameCorrect>는 표현식 <str>이 주어진 <book>의 <name>과 일치하면 참을, 그렇지 않으면 거짓을 반환한다.
  • <nameInclude>는 표현식 <str>이 주어진 <book>의 <name>에 포함되면 참을, 그렇지 않으면 거짓을 반환한다.
  • <authorCorrect>는 표현식 <str>이 주어진 <book>의 <author>와 일치하면 참을, 그렇지 않으면 거짓을 반환한다.
  • <tagCorrect>는 주어진 <book>의 <tags> 안에 <str>과 일치하는 <tag>가 하나라도 있으면 참을, 그렇지 않으면 거짓을 반환한다.
  • <AND>는 <methods> 안의 모든 <method>가 참을 반환하면 참을, 그렇지 않으면 거짓을 반환한다.
  • <OR>는 <methods> 안의 <method> 중 하나라도 참을 반환하면 참을, 그렇지 않으면 거짓을 반환한다.
  • <NOT>은 <method>가 참을 반환하면 거짓을, 그렇지 않으면 참을 반환한다.
  • <search>는 DB 안의 모든 <book> 중 <methods> 안의 모든 <method>가 참을 반환하는 <book>의 개수를 반환한다.

입력

첫째 줄에 DB에 저장된 <book>의 개수 NN이 주어진다. 다음 NN개 줄에 <book>이 한 줄에 하나씩 주어진다.

다음 줄에는 검색 요청 <search>의 개수 MM이 주어진다. 다음 MM개 줄에 <search>가 한 줄에 하나씩 주어진다.

잘못된 문자열은 입력으로 주어지지 않는다.

출력

각 <search>에 대한 결괏값을 한 줄에 하나씩 출력한다.

제한

1leN,Mle2001 \\le N, M \\le 200

입력으로 주어지는 <book>의 길이는 200200 이하이다.

입력으로 주어지는 <search>의 길이는 1,5001\\,500 이하이다.

입력으로 주어지는 모든 수는 정수이다.

예제1

  1. 예제 1

    입력
    4
    Gullivers_Travels Jonathan_Swift novel fairytale
    1984 George_Orwell novel SF
    Toji Pak_Kyong-ni novel korean
    Cosmos Carl_Sagan science cosmology
    5
    n:Gulliver
    ni:Gulliver
    N(ni:Gulliver)
    a:Pak_Kyong-ni, t:novel
    O(A(t:novel, N(t:fairytale)), A(t:fairytale, N(t:novel)))
    
    예상 출력
    0
    1
    3
    1
    2