QOJ.ac

QOJ

حد الوقت: 3 s حد الذاكرة: 384 MB مجموع النقاط: 100 الصعوبة: [عرض]

#1788. Квантовий зв’язок

الإحصائيات

小Z самостійно вивчає квантові комп'ютери. Нещодавно, досліджуючи розділ про квантовий зв'язок, він натрапив на цікаву задачу. Alice і Bob здійснюють квантовий зв'язок. Мовою їхнього спілкування є словник $S$ розміру $n$, у якому кожне слово $s_i$ ($1\le i\le n$) можна подати двійковим рядком довжини $256$. У цій задачі $s_i$ можна згенерувати викликом функції gen, з якою можна ознайомитися у файлі gen.cpp у каталозі задачі. Параметри цієї функції $n,a_1,a_2$ задані у вхідних даних.

Alice і Bob планують здійснити $m$ передач. Під час кожної Alice надсилає Bob рівно одне слово зі словника. Проте канал зв'язку ненадійний і зазнає впливу шуму. Точніше, позначимо початкове слово, яке Alice передає під час $i$-ї передачі, через $x_i$. Через шум у цьому двійковому рядку можуть змінитися на протилежні щонайбільше $k_i$ бітів. Інакше кажучи, якщо $y_i$ — двійковий рядок, який отримав Bob, то він може відрізнятися від $x_i$ щонайбільше в $k_i$ позиціях і може не належати словнику $S$.

Водночас Bob дізнався, що зловмисник Eve проник у їхній канал зв'язку й готується заважати спілкуванню. Він може замінити двійковий рядок, який отримує Bob, на довільний двійковий рядок довжини $256$, який також може не належати словнику $S$. Eve дуже хитрий і не обов'язково втручається в кожну передачу.

Bob звернувся до вас по допомогу. Для кожної з наступних передач, знаючи остаточний двійковий рядок, який отримав Bob, і поріг шумових спотворень $k_i$ ($0\le k_i\le 15$), визначте, чи можливо, що Eve не втручався в цю передачу. Тобто чи можна отримати прийнятий рядок зі слова словника, змінивши на протилежні щонайбільше $k_i$ бітів. Якщо можливо, що Eve не втручався, виведіть $1$, інакше — $0$. Bob дуже довіряє вашим здібностям, тому ви маєте відповідати на запити в режимі онлайн; точні вимоги наведено в розділі вхідних даних.

Щоб зменшити час зчитування, рядки, які отримав Bob, задано шістнадцятковими рядками довжини $64$. Вони складаються з цифр 0–9 і великих латинських літер A–F, причому літери A–F позначають відповідно значення $10$–$15$. Кожну шістнадцяткову цифру можна перетворити на двійковий рядок: наприклад, 5 відповідає 0101, A — 1010, а C — 1100.

Вхідні дані

Зчитайте дані з файлу qi.in.

Перший рядок містить чотири невід'ємні цілі числа $n,m,a_1,a_2$ — розмір словника, кількість передач і початкові значення параметрів $a_1$ та $a_2$ функції gen відповідно.

У своїй програмі слід викликати згадану в умові функцію gen, щоб створити словник. Ви можете скопіювати й використати код із gen.cpp. Булевий масив s[N+1][256] у цій програмі містить усі слова.

Кожен із наступних $m$ рядків містить шістнадцятковий рядок довжини $64$ і невід'ємне ціле число $k_i$ — остаточний двійковий рядок, який отримав Bob під час $i$-ї передачі, та поріг шумових спотворень відповідно.

Щоб змусити вас відповідати на запити в режимі онлайн, після перетворення шістнадцяткового рядка на двійковий рядок довжини $256$ слід застосувати XOR кожного біта з $lastans$. Лише тоді ви отримаєте справжній двійковий рядок, який отримав Bob під час цієї передачі. Тут $lastans\in\{0,1\}$ — відповідь на попередній запит; перед першим запитом початкове значення $lastans$ дорівнює $0$.

Зауважте: для зчитування або виведення змінних типу unsigned long long за допомогою функцій scanf і printf відповідний специфікатор — llu.

Вихідні дані

Виведіть результат у файл qi.out.

Виведіть $m$ рядків, кожен з одним цілим числом $0$ або $1$ — відповіддю на поточний запит.

Приклад запитів

Щоб пояснити умову, розглянемо спрощений випадок: слова словника задано явно, їхню довжину зменшено до $4$, а відповідати на запити дозволено офлайн.

Нехай словник має розмір $n=2$ і містить слова 1010 та 0111.

Для запиту $\texttt{B}=\texttt{1011}$ і $k_1=1$ відповідь має бути $1$: рядок можна отримати, змінивши четвертий біт слова 1010 (біти рахуємо від старшого до молодшого; так само й далі).

Для запиту $\texttt{1}=\texttt{0001}$ і $k_2=2$ відповідь має бути $1$: рядок можна отримати, змінивши другий і третій біти слова 0111.

Для запиту $\texttt{1}=\texttt{0001}$ і $k_3=1$ відповідь має бути $0$.

  • Змінивши щонайбільше один біт слова 1010, можна отримати 1010, 0010, 1110, 1000, 1011.
  • Змінивши щонайбільше один біт слова 0111, можна отримати 0111, 1111, 0011, 0101, 0110.
  • Отримати $\texttt{1}=\texttt{0001}$ неможливо, тому цей рядок неодмінно є наслідком втручання Eve.

Приклади

Приклад 1

Дивіться файли qi/qi1.in і qi/qi1.ans у каталозі учасника.

Приклад 2

Дивіться файли qi/qi2.in і qi/qi2.ans у каталозі учасника.

Приклад 3

Дивіться файли qi/qi3.in і qi/qi3.ans у каталозі учасника.

Обмеження

Для всіх тестів: $1\le n\le 4\times 10^5$, $1\le m\le 1.2\times 10^5$, $0\le k\le 15$; $a_1$ і $a_2$ рівномірно випадково вибрані з діапазону $[0,2^{64}-1]$.

Номер тесту $n=$ $m=$ $k_i\le$ Особливі властивості
1 $10$ $10$ $2$ Немає
2 $500$ $500$ $15$ Немає
3 $1000$ $1000$ $0$ Немає
4 $2000$ $2000$ $2$ Немає
5 $5000$ $5000$ $15$ Немає
6 $10000$ $10000$ $15$ Немає
7 $20000$ $20000$ $15$ Немає
8 $100000$ $100000$ $1$ Немає
9 $400000$ $120000$ $1$ Немає
10 $50000$ $50000$ $2$ Немає
11 $70000$ $70000$ $3$ Немає
12 $100000$ $100000$ $2$ Немає
13 $30000$ $30000$ $5$ Немає
14 $60000$ $60000$ $4$ Немає
15 $120000$ $120000$ $5$ Немає
16 $60000$ $60000$ $8$ Усі рядки запитів згенеровано випадково
17 $120000$ $120000$ $12$ Усі рядки запитів згенеровано випадково
18 $400000$ $100000$ $15$ Усі рядки запитів згенеровано випадково
19 $30000$ $30000$ $7$ Немає
20 $60000$ $60000$ $9$ Немає
21 $90000$ $90000$ $11$ Немає
22 $200000$ $120000$ $12$ Немає
23 $400000$ $80000$ $15$ Немає
24 $400000$ $100000$ $15$ Немає
25 $400000$ $120000$ $15$ Немає

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.