QOJ.ac

QOJ

시간 제한: 1 s 메모리 제한: 1024 MB 총점: 100 해킹 가능 ✓

#18518. El verdadero folk blues

통계

Estás hackeando un terminal de datos de la Sindicato del Dragón Rojo. El archivo del terminal, denotado como $S$, contiene inicialmente $n$ frecuencias de señales cifradas, cada una representada como una cadena binaria de longitud $k$. Estas frecuencias iniciales están indexadas desde $1$ hasta $n$ en el orden exacto en que se extraen de la memoria del terminal. Para vulnerar el núcleo, debes sintetizar nuevas frecuencias e inyectarlas en el archivo. Cada operación de síntesis agrega exactamente una nueva cadena binaria a $S$, asignándole automáticamente el siguiente índice entero disponible.

Dispones de dos operaciones:

  • Inversión de fase: Selecciona una frecuencia existente $s$ y agrega su complemento bit a bit exacto (Sea $s$ una cadena binaria de longitud $k$, tal que $s = s_1 s_2 \dots s_k$ donde cada bit $s_i \in \{0, 1\}$. El complemento bit a bit de $s$, a menudo denotado matemáticamente como $\neg s$, se define como una nueva cadena binaria de longitud $k$ donde el valor del $i$-ésimo bit es exactamente $1 - s_i$.);
  • Triangulación de señal: Selecciona tres frecuencias existentes $u$, $v$ y $w$ (no necesariamente distintas) y agrega su mayoría bit a bit, denotada como $\operatorname{maj}(u,v,w)$. Para cada posición de bit $i$, la operación evalúa: $$\operatorname{maj}(u,v,w)_i = \operatorname{maj}(u_i,v_i,w_i).$$ Para bits individuales $a$, $b$, $c$, $\operatorname{maj}(a,b,c)$ es $1$ si al menos dos de ellos son $1$, y $0$ en caso contrario.

Tu objetivo es determinar si es posible forjar un código de recompensa objetivo específico $t$ de longitud $k$. Si es posible, debes proporcionar una secuencia de operaciones (como máximo $10^5$) que lo construya exitosamente.

Entrada

La primera línea del flujo del terminal contiene dos enteros $n$ y $k$ ($1 \le n, k \le 200$), que representan el número de códigos iniciales y la longitud de cada código.

Cada una de las siguientes $n$ líneas contiene una cadena binaria (solo 0s y 1s) de longitud $k$, que muestra un código actualmente en el archivo.

La última línea contiene una única cadena binaria $t$ de longitud $k$, que representa el código de recompensa objetivo que necesitas forjar.

Salida

Si es imposible forjar el código objetivo $t$, imprime una única línea que contenga NO.

En caso contrario, imprime YES. En la siguiente línea, imprime un entero $m$ ($0 \le m \le 10^5$), que representa el número total de operaciones que usarás. Luego, imprime $m$ líneas describiendo tus operaciones en orden:

  • 1 x: Toma el código existente en el índice $x$ y aplica Inversión de fase (agrega el complemento bit a bit de $x$);
  • 2 x y z: Toma los códigos existentes en los índices $x$, $y$ y $z$ y aplica Triangulación de señal (agrega $\operatorname{maj}$ de las cadenas existentes con índices $x$, $y$ y $z$).

Cada índice que uses debe existir en el archivo en el momento en que lo uses. Después de todas las $m$ operaciones, al menos un código en el archivo debe coincidir exactamente con tu objetivo $t$. Si el código objetivo $t$ ya está en el archivo inicial, puedes simplemente imprimir $m = 0$.

Si hay varias formas correctas de forjar el código, puedes imprimir cualquier secuencia válida de operaciones.

Ejemplos

Entrada 1

3 4
1000
0100
0010
1111

Salida 1

YES
4
1 1
1 2
1 3
2 4 5 6

Nota

  • Las primeras tres operaciones agregan los complementos de las cadenas iniciales, creando 0111, 1011 y 1101.
  • La última operación toma la mayoría bit a bit de estas tres cadenas.
  • En cada posición al menos dos de ellas tienen el bit $1$, por lo que la cadena agregada es 1111, que es el objetivo.

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.