QOJ.ac

QOJ

Time Limit: 1.0 s Memory Limit: 2048 MB Total points: 100 Interactive

#17330. 산타의 비밀 누설하기

Statistics

크리스마스 시즌입니다! 대부분의 직장이 비밀 산타 선물 교환을 준비하는 동안, 여러분의 직장에서는 더 사악한 음모, 즉 산타의 비밀을 파헤치려는 계획을 세우고 있습니다.

산타는 지구상의 모든 사람에 대한 '착한 아이/나쁜 아이' 명단을 가지고 있습니다. 이 명단은 내용이 매우 민감하기 때문에, $N$개의 문자로 이루어진 난해한 언어인 '노스 폴란드어(North-Polish)'로 작성되어 있습니다. 보안을 강화하기 위해 산타는 이 명단을 치환 암호(substitution cipher)로 암호화했습니다. 이는 $1, 2, \dots, N$의 순열 $H$를 사용하여 각 노스 폴란드어 문자 $i$를 서로 다른 문자 $H(i)$로 매핑하는 방식입니다. 이러한 암호에서는 두 문자가 동일한 대상 문자로 매핑되지 않습니다. 즉, 형식적으로 $i \neq j$이면 $H(i) \neq H(j)$입니다. 그렇지 않으면 산타가 자신의 명단을 해독할 수 없기 때문입니다! (산타는 더 까다롭게 만들기 위해 일부 문자를 자기 자신에게 매핑할 수도 있습니다, 즉 $H(i) = i$.)

다행히도 산타의 서버는 보안이 허술하게 설계되어 공용 인터넷에 노출되어 있습니다. 여러분과 동료들은 산타의 서버를 해킹하여 명단을 해독하고, 여러분 모두가 '나쁜 아이'임을 확인하고자 합니다! (해커는 항상 나쁜 아이니까요.)

이 서버는 산타가 이동 중에도 빠르게 명단을 확인할 수 있도록 만들어졌습니다. 사용자가 서버에 연결하면, 서버는 순열 $H$를 인코딩하는 $N$개의 정수 $H(1), H(2), \dots, H(N)$을 입력하라는 메시지를 표시하고, 이 목록이 올바른지 확인한 다음 산타의 비밀 명단을 해독합니다. 수개월의 연구 끝에 여러분은 부채널 타이밍 취약점을 발견했습니다. 순열 $Q$를 입력한다고 가정해 봅시다. 만약 $H = Q$라면, 서버는 즉시 접근을 허용합니다. 그렇지 않은 경우, $N$개의 정점으로 구성된 그래프를 고려하고 각 정점 $i$에서 정점 $H(Q(i))$로 향하는 간선을 추가합니다. 여러분은 서버의 복잡한 인증 알고리즘이 응답으로 'Access Denied(접근 거부)' 오류 메시지를 보내는 데 걸리는 시간이 결과 그래프의 연결 요소(connected component) 개수와 정확히 일치한다는 사실을 발견했습니다.

예를 들어, $N = 4$이고 암호 순열 $H$가 다음과 같다고 가정해 봅시다:

$i$ 1 2 3 4
$H(i)$ 2 3 1 4

만약 입력값 4 3 2 1로 서버에 로그인을 시도하면, 이 순열은 $H$와 일치하지 않으며 위에서 설명한 그래프는 두 개의 연결 요소(간선 $1 \to 4 \to 2 \to 1$로 이루어진 사이클 하나와 자기 루프 $3 \to 3$으로 이루어진 요소 하나)를 가지므로, 서버는 2초의 지연 시간 후에 'Access Denied' 오류 메시지로 응답할 것입니다.

서로 다른 입력 $Q$를 사용하여 서버에 여러 번 로그인을 시도하더라도, 서버는 매번 동일하게 저장된 $H$를 기준으로 $Q$를 인증한다는 점에 유의하세요. 입력에 따라 $H$가 변경되지는 않습니다.

산타는 자신의 서버에 무단 요청이 쏟아지면 이를 알아챌 것입니다. 여러분은 너무 많은 의심을 사지 않고 최대 1,510번의 로그인 시도만 할 수 있다고 추정했습니다. 암호 순열을 결정하기 위한 효율적인 전략을 찾을 수 있을까요?

인터랙션

이 문제는 인터랙티브 문제입니다. 인터랙션은 표준 입력에서 노스 폴란드어의 문자 수인 정수 $N$ ($1 \le N \le 220$)을 읽는 것으로 시작합니다. 심판(judge)은 적응형(adaptive)이 아닙니다. 숨겨진 순열 $H$는 이 시점에 결정되며 인터랙션이 끝날 때까지 변경되지 않습니다.

서버에 로그인을 시도하려면, $Q$가 $\{1, 2, \dots, N\}$의 순열일 때 $N$개의 공백으로 구분된 정수 $Q(1), \dots, Q(N)$을 한 줄에 출력하세요. 그런 다음 표준 입력에서 서버가 여러분의 입력에 응답하는 데 걸린 시간(초)을 나타내는 정수 하나를 읽으세요.

이 지연 시간이 0이면, 암호 순열 $H$를 성공적으로 찾은 것이며 프로그램은 종료되어야 합니다. 그렇지 않다면, 이 지연 시간은 위에서 설명한 절차에 따라 구축된 그래프의 연결 요소 개수입니다.

최대 1,510번까지 로그인을 시도할 수 있습니다. 시도 횟수를 모두 소진하면 프로그램은 깔끔하게 종료되어야 합니다(단, 산타의 명단을 해독하지 못한 것으로 간주되어 오답 처리됩니다).

참고

  • 출력하는 각 줄 뒤에는 반드시 출력 스트림을 플러시(flush)하고, 인터랙션이 완료된 후에는 깔끔하게 종료하는 것을 잊지 마세요. 또한 어떤 정보를 어떤 출력 줄에 인쇄해야 하는지에 대한 인터랙션 프로토콜을 정확히 따르도록 하세요. 예를 들어, 프로토콜이 한 줄에 공백으로 구분된 정수 목록을 인쇄하도록 요구하는 경우, 심판은 각 정수를 별도의 줄에 인쇄하는 것을 허용하지 않습니다.
  • 심판이 유효하지 않거나 예상치 못한 입력을 받으면 -1을 출력하고 즉시 종료합니다. 여러분의 프로그램은 이를 감지하고 깔끔하게 종료하여 'Wrong Answer' 판정을 받아야 합니다. 프로그램이 심판의 추가 인터랙션을 기다리며 차단되거나, -1을 연결 요소의 개수로 해석하려고 시도하면 'Wrong Answer' 대신 'Time Limit Exceeded' 또는 'Runtime Error'와 같은 다른 거부 판정을 받을 수 있습니다.
  • 로컬 테스트를 위한 명령줄 도구가 제공되었습니다. 이 도구의 상단에는 사용법을 설명하는 주석이 포함되어 있습니다.

예제

예제 1

3
1 2 3
1
2 1 3
2
3 1 2
0

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.