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

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

양자 통신

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

요약
온라인으로 들어오는 각 질의마다, 256비트 문자열이 사전의 어떤 단어와 해밍 거리 k 이하인지 판별합니다.
난이도

어려움10점 중 8점

유형
해시맵, 비트 연산, 구현
정답자
아직 제출이 없습니다

문제

Alice와 Bob은 양자 통신을 하고 있다. 두 사람이 쓰는 언어는 크기가 nn인 사전 SS이다. 사전의 각 단어 sis_i (1≤i≤n1 \le i \le n)는 256비트 이진 문자열이며, gen 함수를 호출해서 생성할 수 있다. gen.cpp 파일을 참고해도 되고, 매개변수 nn, a1a_1, a2a_2는 각 테스트 케이스에서 주어진다.

Alice와 Bob은 mm 라운드 동안 통신한다. 각 라운드에서 Alice는 사전의 단어를 정확히 하나 Bob에게 보낸다. 다만 통신 채널은 믿을 수 없어서 잡음의 영향을 받을 수 있다. 정확히 말하면, ii번째 라운드에서 Alice가 보내려는 단어가 xix_i라면 이진 문자열의 최대 kik_i개 비트가 뒤집힐 수 있다. 즉 Bob이 받는 문자열 yiy_i는 xix_i와 최대 kik_i개 위치에서 다르다. yiy_i가 사전 SS에 있어야 하는 것은 아니다.

Eve가 통신 채널에 침입해 통신을 조작한다. Eve는 Bob이 받을 문자열을 임의의 256비트 이진 문자열로 바꿀 수 있다. 이 문자열도 사전에 있을 필요는 없다. Eve가 모든 라운드를 조작하는 것은 아니다.

Bob은 각 라운드가 Eve의 조작을 받지 않았을 가능성이 있는지 알고 싶다. Bob이 받은 문자열과 잡음 임계값 kik_i (0≤ki≤150 \le k_i \le 15)가 주어지면, 사전의 어떤 단어에서 최대 kik_i개 비트를 뒤집어 받은 문자열을 얻을 수 있는지 판단한다. 가능하면 1을, 그렇지 않으면 0을 출력한다. 질의는 온라인으로 답해야 한다. 자세한 내용은 입력 부분을 참고한다.

입력

첫 줄에 음이 아닌 정수 네 개 nn, mm, a1a_1, a2a_2가 주어진다. 각각 사전의 크기, 라운드 수, 함수 gen의 매개변수 a1a_1, a2a_2의 초기값이다. 사전은 gen 함수로 생성한다. gen.cpp의 코드를 복사해 사용해도 된다. 불리언 배열 s[N+1][256]에는 모든 단어가 들어 있다.

이어지는 mm개 줄에는 길이 64의 16진수 문자열과 음이 아닌 정수 kik_i가 주어진다. 16진수 문자열은 라운드 ii에서 Bob이 최종적으로 받은 이진 문자열이고, kik_i는 그 라운드의 잡음 임계값이다.

질의를 온라인으로 처리하도록 하기 위해, 16진수 문자열을 256비트 이진 문자열로 바꾼 뒤 lastans와 비트별로 XOR 연산을 해야 Bob이 실제로 받은 문자열을 얻을 수 있다. lastans는 {0,1}\{0,1\} 중 하나이며 직전 질의의 답이다. 첫 라운드 전 lastans의 값은 0이다.

16진수 한 자리는 4비트로 바꾼다. 예를 들어 5는 0101, A는 1010, C는 1100이 된다. 각 자리는 0-9와 대문자 A-F이며, A-F는 순서대로 10부터 15를 나타낸다.

unsigned long long 변수를 scanf나 printf로 읽거나 쓸 때는 llu를 사용한다.

출력

mm개의 줄을 출력한다. 각 줄에는 해당 질의에 대한 답인 0 또는 1을 출력한다.

제한

모든 테스트 케이스에 대해 1≤n≤4×1051 \le n \le 4 \times 10^5, 1≤m≤1.2×1051 \le m \le 1.2 \times 10^5, 0≤k≤150 \le k \le 15이다. a1a_1과 a2a_2는 [0,264−1][0,2^{64}-1] 범위에서 균등한 확률로 무작위 선택된다.

테스트 케이스n=n =m=m =ki≤k_i \le추가 제약
1101022없음.
25005001515
31000100000
42000200022
5500050001515
61000010000
72000020000
810000010000011
9400000400000120000120000
10500005000022
11700007000033
1210000010000022
13300003000055
14600006000044
1512000012000055
16600006000088질의 문자열은 무작위로 생성된다.
171200001200001212
184000004000001000001000001515
19300003000077없음.
20600006000099
2190000900001111
222000002000001200001200001212
2340000040000080000800001515
244000004000001000001000001515
254000004000001200001200001515

예제1

  1. 예제 1

    입력
    1 1 0 0
    0000000000000000000000000000000000000000000000000000000000000000 0
    
    예상 출력
    1