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

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

Wire-compatible Protocol buffer

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

요약
프로토콜 버퍼 디스크립터를 파싱한 뒤 두 메시지 타입이 필드 번호와 타입, 라벨을 기준으로 와이어 포맷 호환인지 판정한다.
난이도

보통10점 중 7점

유형
구현, 해시맵, 그래프, DFS
정답자
아직 제출이 없습니다

문제

Protocol buffers(줄여서 protobuf)는 구조화된 데이터를 직렬화하기 위한 유연하고 효율적이며 자동화된 메커니즘이다. XML을 떠올리면 되는데, 더 작고 빠르고 단순하다. 이 문제에서는 단순화된 protocol buffer에서의 wire-compatible 문제를 다룬다.

입력

첫 번째 줄에는 protobuf descriptor의 줄 수를 나타내는 정수 nn이 주어진다.

다음 nn개의 줄은 메시지들의 집합을 담고 있는 protobuf descriptor의 내용이다. 각 줄은 120자를 넘지 않는다.

그 다음 줄에는 정수 mm(1≤m≤500001 \le m \le 50000)이 주어지며, 이는 mm개의 wire-format 호환성 질의가 있음을 나타낸다.

그 다음 mm개의 줄이 주어지며, 각 줄은 두 메시지 이름으로 이루어진 wire-format 호환성 질의이다.

descriptor는 유효함이 보장된다. 즉, 두 메시지가 같은 이름을 가지지 않고, 한 메시지의 두 필드가 같은 필드 이름이나 태그 번호를 가지지 않으며, 필드에 있는 각 메시지 타입은 반드시 존재하는 메시지 이름 중 하나이다.

descriptor에는 메시지가 최대 1000개 있고, 각 메시지는 최대 16개의 필드를 가진다.

입력의 모든 토큰은 공백으로 구분된다.

출력

각 질의에 대해, 질의에 있는 두 메시지가 wire-format compatible이면 "Wire-format compatible."을, 그렇지 않으면 "Wire-format incompatible."을 한 줄에 출력한다. (따옴표는 명확성을 위해 표기한 것이다.)

힌트

첫 번째 예제에서:

  • Test1과 Test2는 두 메시지의 필드 이름이 다르지만, 직렬화된 메시지는 필드 번호만을 고려한다.
  • Test1과 Test3은 두 메시지가 같은 필드 이름을 가지지만, 필드 번호가 일치하지 않는다.
  • Test1과 Test4는 required와 optional이 호환되지 않음이 자명하다.
  • Test1과 Test5는 모든 유효한 UTF-8 문자열이 유효한 메시지인 것은 아니며, 그 반대도 마찬가지이다.

예제3

  1. 예제 1

    입력
    18
    message Test1 {
      optional string field = 1 ;
    }
    message Test2 {
      optional string field_string = 1 ;
    }
    message Test3 {
      optional string field = 2 ;
    }
    message Test4 {
      required string field = 1 ;
    }
    message StringMessage {
      optional string field = 1 ;
    }
    message Test5 {
      optional StringMessage field = 1 ;
    }
    4
    Test1 Test2
    Test1 Test3
    Test1 Test4
    Test1 Test5
    
    예상 출력
    Wire-format compatible.
    Wire-format incompatible.
    Wire-format incompatible.
    Wire-format incompatible.
    
  2. 예제 2

    입력
    5
    message A { optional B nest = 1 ; }
    message B { optional C nest = 1 ; }
    message C { }
    message D { optional E nest = 1 ; }
    message E { }
    2
    B D
    A D
    
    예상 출력
    Wire-format compatible.
    Wire-format incompatible.
    
  3. 예제 3

    입력
    3
    message A { optional A nest = 1 ; }
    message B { optional C nest = 1 ; }
    message C { optional B nest = 1 ; }
    3
    A B
    A C
    B C
    
    예상 출력
    Wire-format compatible.
    Wire-format compatible.
    Wire-format compatible.