만드는 중입니다

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

멀티 플레이어 게임

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

요약
브루는 길이 N의 순열 A를 제출하고, 민규는 피벗으로 분할된 순열 A'만 보고 길이 L의 이진 문자열 S를 정확히 복원해야 합니다.
난이도

어려움10점 중 9점

유형
배열, 수학, 구현
정답자
아직 제출이 없습니다

문제

이 문제는 투 스텝 인터랙티브 문제입니다.

브루와 민규는 서울과학고등학교에서 열리는 전략 서바이벌 게임 '더 챌린저스'에 팀으로 참가했다.

예선 게임에서는 두 팀원 중 한 명이 송신자, 다른 한 명이 수신자 역할을 맡는다. 게임이 진행되는 동안 두 팀원은 서로 다른 방에 들어가며 소통할 수 없다. 브루가 송신자, 민규가 수신자 역할을 맡는다.

게임의 딜러 동현은 먼저 브루의 방에 들어가 길이 LL의 비트스트링 SS('0'과 '1'로만 이루어진 문자열)를 제시한다. 이후 브루는 길이 NN의 순열 AA를 제출해야 한다. 동현은 브루가 제출한 순열을 다음 과정으로 섞는다.

  • 먼저 순열 AA의 수 중 하나를 피봇 pp로 선택한다.
  • 이후 pp보다 작은 수는 원래 순열에서의 순서대로 pp 왼쪽에, pp보다 큰 수는 원래 순열에서의 순서대로 pp 오른쪽에 놓는다. 이렇게 섞인 순열을 A′A'이라고 하자.

예를 들어 원래 순열이 A=[3,6,1,5,4,2]A=[3,6,1,5,4,2]이고 피봇이 p=4p=4라면, 섞인 순열은 A′=[3,1,2,4,6,5]A'=[3,1,2,4,6,5]가 된다. 이후 동현은 민규에게 순열 A′A'를 전달한다. 민규가 A′A'를 보고 비트스트링 SS를 정확히 맞히면 게임에서 승리한다.

민규가 운 좋게 SS를 맞히는 것을 막기 위해, 동현은 처음에 브루에게 TT개의 비트스트링을 제시한다. 브루가 제출한 TT개의 순열 각각을 동현이 섞어 새로운 순열 TT개를 만들고, 이 TT개의 순열을 임의의 순서로 민규에게 전달한다.

브루와 민규는 게임 전에 전략을 논의할 수 있다. 또한 게임 전에 NN과 LL의 값을 직접 정할 수 있다. NN과 LL의 값에 따라 게임의 난이도와 승리 시 얻는 점수가 정해진다. 난이도를 쉽게 정하면 승리할 수 있겠지만, 얻는 점수가 더 낮아진다.

브루와 민규가 게임에서 승리할 수 있는 최선의 전략을 만들어 보자.

제한

  • RR은 brue 또는 mingyu
  • 1≤T≤10001 \le T \le 1000
  • SS는 길이 LL의 문자열
  • SiS_i는 '0' 또는 '1' (1≤i≤L1 \le i \le L)
  • 1≤N≤601 \le N \le 60
  • 1≤L≤2101 \le L \le 210
  • 1≤Ai≤N1 \le A_i \le N (1≤i≤N1 \le i \le N)
  • Ai≠AjA_i \ne A_j (1≤i<j≤N1 \le i < j \le N)

힌트

출력 버퍼를 비우는 방법은 다음과 같다.

  • C: fflush(stdout)
  • C++: std::cout << std::flush
  • Java: System.out.flush()
  • Python: sys.stdout.flush()

이외의 언어에 대해서는 언어별 명세를 참고해야 한다.

예제2

  1. 예제 1

    입력
    brue 2
    
    000
    100
    
    예상 출력
    
    5 3
    
    
    3 1 4 2 5
    2 1 4 5 3
    
  2. 예제 2

    입력
    mingyu 2
    2 1 3 4 5
    1 3 4 2 5
    
    예상 출력
    
    
    
    100
    000