Module: Iterar sobre todos los subpatrones de una máscara dada


Problem

5 /7


Eric y la placa LED

Theory Click to read/hide

Sucede que es necesario enumerar todas las secuencias de bits de cierta longitud. O, en otras palabras, iterar sobre todas las opciones posibles, donde para cada objeto se selecciona uno de los dos estados posibles.

En tales situaciones, es posible implementar la enumeración utilizando máscaras de bits. La ventaja de este enfoque es que dicho código funciona de forma no recursiva y opera con números en lugar de colecciones o similares, lo que mejora enormemente el rendimiento.

El código general que usa máscaras de bits se proporciona a continuación: interno; // número de oobjects (longitud de la secuencia de bits) for (int mask = 0; mask < (1 << n); mask++) { // recorrer todos los números del 0 al 2^n - 1, donde cada número corresponde a una máscara de bits // la máscara de número actual es una máscara de bits, donde el i-ésimo bit especifica el estado del i-ésimo objeto for (int i = 0; i < n; i++) { // iterar sobre n bits para comprender qué estado tiene cada objeto if ((1 << i) & mask) { // comprueba si el i-ésimo bit es igual a uno // procesa la opción de que el i-ésimo objeto tiene el estado '1' } else { // caso cuando el i-ésimo bit es cero // procesar la opción de que el i-ésimo objeto del estado '0' } } }
Este código se ejecuta en O(2^n * f(n)), donde f(n) es el tiempo que le lleva procesar un iterable en particular.

Problem

Eric encontró una placa LED en el antiguo garaje de su abuelo. Sin embargo, le sorprendió que al activarse, los diodos no estuvieran sincronizados entre sí. Es decir, algunos de ellos se quemaron y otros no.
El tablero en sí resultó ser inusual. Es una cuadrícula rectangular con n filas y m columnas, donde cada celda contiene un diodo. Cerca de cada fila hay una palanca que cambia todos los diodos en esta fila (los diodos encendidos se apagan y viceversa). Cada columna tiene las mismas palancas (que utilizo los diodos en la columna correspondiente).
Eric se preguntó si era posible cambiar los diodos al mismo estado cambiando las palancas.

Entrada:
La primera línea contiene dos números naturales n y m (1 <= n, m <= 7) - el número de filas y columnas en el tablero, respectivamente.
Luego hay n líneas con m números cada una: los estados de los diodos, donde 0 significa que el diodo está apagado y 1 que está encendido.

Salida:
Escriba "SÍ" si es posible llevar los diodos a un estado y "NO" si es imposible.

Ejemplos:
 
Explicación:
En el primer ejemplo, puede cambiar todos los diodos en la primera fila y luego cambiar todos los diodos en la primera columna. Entonces todos los diodos estarán apagados.
 
Entrada Salida
2 2
0 1
10
SI
2 2
0 1
0 0
NO