QOJ.ac

QOJ

Time Limit: 3 s Memory Limit: 384 MB Total points: 100 Difficulty: [show]

#1788. Comunicação quântica

Statistics

小Z está a estudar por conta própria temas relacionados com computadores quânticos. Recentemente, ao estudar o capítulo sobre comunicação quântica, encontrou um problema interessante. Neste problema, Alice e Bob comunicam por meios quânticos, usando como linguagem um dicionário $S$ de tamanho $n$. Cada palavra $s_i$, com $1\le i\le n$, pode ser representada por uma cadeia binária de 256 bits. Neste problema, as palavras $s_i$ podem ser geradas chamando a função gen, que podes consultar em gen.cpp, no diretório do problema. Os parâmetros n, a1 e a2 dessa função são fornecidos na entrada.

Alice e Bob vão realizar $m$ comunicações. Em cada uma, Alice transmite a Bob exatamente uma palavra do dicionário. Porém, o canal que utilizam não é fiável e sofre interferência de ruído. Mais precisamente, na transmissão $i$, seja $x_i$ a palavra original transmitida por Alice. O ruído pode inverter, no máximo, $k_i$ bits dessa cadeia binária. Por outras palavras, se $y_i$ for a cadeia recebida por Bob, pode diferir de $x_i$ em, no máximo, $k_i$ posições, e pode nem sequer pertencer ao dicionário $S$.

Entretanto, Bob descobriu que o malfeitor Eve também se infiltrou no canal e se prepara para interferir nas comunicações. Eve pode substituir a cadeia recebida por Bob por uma cadeia binária arbitrária de 256 bits, que também pode não pertencer a $S$. Eve é muito astuto e não interfere necessariamente em todas as comunicações.

Bob pediu-te ajuda. Para cada uma das próximas comunicações, dadas a cadeia binária que Bob recebe no final e a tolerância ao ruído $k_i$, com $0\le k_i\le15$, determina se é possível que Eve não tenha interferido. Isto equivale a determinar se a cadeia recebida pode ser obtida a partir de alguma palavra do dicionário invertendo, no máximo, $k_i$ bits. Se for possível que Eve não tenha interferido, apresenta $1$; caso contrário, apresenta $0$. Bob confia muito nas tuas capacidades, pelo que tens de responder às consultas em linha, segundo os requisitos específicos da entrada.

Para reduzir o tempo de leitura, as cadeias recebidas por Bob são fornecidas como cadeias hexadecimais de comprimento 64, compostas pelos algarismos 0 a 9 e pelas letras maiúsculas A a F. As letras A a F representam, por ordem, os valores $10$ a $15$. Cada caráter hexadecimal pode ser convertido nos respetivos bits: por exemplo, 5 corresponde a 0101, A a 1010 e C a 1100.

Entrada

Lê os dados do ficheiro qi.in.

A primeira linha contém quatro inteiros não negativos $n,m,a_1,a_2$, que representam, respetivamente, o tamanho do dicionário, o número de comunicações e os valores iniciais dos parâmetros a1 e a2 da função gen.

Deves chamar no teu programa a função gen referida na descrição para gerar o dicionário. Podes copiar e utilizar o código de gen.cpp. A matriz booleana s[N+1][256] desse programa contém todas as palavras.

Seguem-se $m$ linhas, cada uma com uma cadeia hexadecimal de comprimento $64$ e um inteiro não negativo $k_i$, que representam, respetivamente, a cadeia binária que Bob recebe no final da comunicação $i$ e a tolerância ao ruído.

Para obrigar a responder às consultas em linha, depois de converteres a cadeia hexadecimal numa cadeia binária de 256 bits, tens de aplicar o OU exclusivo de cada bit com $lastans$ para obter a verdadeira cadeia recebida por Bob nessa comunicação. Aqui, $lastans\in\{0,1\}$ é a resposta à consulta anterior e tem valor inicial $0$ antes da primeira consulta.

Atenção: ao ler ou escrever variáveis do tipo unsigned long long com as funções scanf e printf, o especificador correspondente é llu.

Saída

Escreve a saída no ficheiro qi.out.

Apresenta $m$ linhas, cada uma com um inteiro $0$ ou $1$, que representa a resposta à consulta atual.

Exemplos de consultas

Para facilitar a explicação, ilustramos uma situação simplificada em que as palavras do dicionário são dadas diretamente, o seu comprimento é reduzido para 4 e é permitido responder às consultas fora de linha.

Considera um dicionário de tamanho $n=2$, com as palavras 1010 e 0111.

Para a consulta B = 1011 com $k_1=1$, a resposta deve ser $1$: obtém-se invertendo o quarto bit de 1010, contando do mais significativo para o menos significativo, como também se fará a seguir.

Para a consulta 1 = 0001 com $k_2=2$, a resposta deve ser $1$: obtém-se invertendo os bits 2 e 3 de 0111.

Para a consulta 1 = 0001 com $k_3=1$, a resposta deve ser $0$.

  • Invertendo, no máximo, 1 bit de 1010, podem obter-se 1010, 0010, 1110, 1000 e 1011.
  • Invertendo, no máximo, 1 bit de 0111, podem obter-se 0111, 1111, 0011, 0101 e 0110.
  • Não se consegue obter 1 = 0001; esta cadeia resulta necessariamente da interferência de Eve.

Exemplos

Exemplo 1

Consulta os ficheiros qi/qi1.in e qi/qi1.ans no diretório dos concorrentes.

Exemplo 2

Consulta os ficheiros qi/qi2.in e qi/qi2.ans no diretório dos concorrentes.

Exemplo 3

Consulta os ficheiros qi/qi3.in e qi/qi3.ans no diretório dos concorrentes.

Restrições dos testes

Para todos os testes: $1\le n\le4\times10^5$, $1\le m\le1.2\times10^5$, $0\le k\le15$. Os valores de $a_1$ e $a_2$ são gerados uniformemente ao acaso no intervalo $[0,2^{64}-1]$.

Número do teste $n=$ $m=$ $k_i\le$ Propriedade especial
1 $10$ $10$ $2$ Nenhuma
2 $500$ $500$ $15$ Nenhuma
3 $1000$ $1000$ $0$ Nenhuma
4 $2000$ $2000$ $2$ Nenhuma
5 $5000$ $5000$ $15$ Nenhuma
6 $10000$ $10000$ $15$ Nenhuma
7 $20000$ $20000$ $15$ Nenhuma
8 $100000$ $100000$ $1$ Nenhuma
9 $400000$ $120000$ $1$ Nenhuma
10 $50000$ $50000$ $2$ Nenhuma
11 $70000$ $70000$ $3$ Nenhuma
12 $100000$ $100000$ $2$ Nenhuma
13 $30000$ $30000$ $5$ Nenhuma
14 $60000$ $60000$ $4$ Nenhuma
15 $120000$ $120000$ $5$ Nenhuma
16 $60000$ $60000$ $8$ Todas as cadeias de consulta são geradas aleatoriamente
17 $120000$ $120000$ $12$ Todas as cadeias de consulta são geradas aleatoriamente
18 $400000$ $100000$ $15$ Todas as cadeias de consulta são geradas aleatoriamente
19 $30000$ $30000$ $7$ Nenhuma
20 $60000$ $60000$ $9$ Nenhuma
21 $90000$ $90000$ $11$ Nenhuma
22 $200000$ $120000$ $12$ Nenhuma
23 $400000$ $80000$ $15$ Nenhuma
24 $400000$ $100000$ $15$ Nenhuma
25 $400000$ $120000$ $15$ Nenhuma

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.