Module: Itera su tutti i sottopattern di una data maschera


Problem

5 /7


Eric e la scheda LED

Theory Click to read/hide

Succede che è necessario enumerare tutte le sequenze di bit di una certa lunghezza. In altre parole, itera su tutte le opzioni possibili, dove per ogni oggetto viene selezionato uno dei due stati possibili.

In tali situazioni, è possibile implementare l'enumerazione utilizzando maschere di bit. Il vantaggio di questo approccio è che tale codice funziona in modo non ricorsivo e opera su numeri invece che su raccolte o simili, il che migliora notevolmente le prestazioni.

Di seguito è riportato il codice generale che utilizza le maschere di bit: int; // numero di oggetti (lunghezza della sequenza di bit) for (int mask = 0; mask < (1 << n); mask++) { // scorre tutti i numeri da 0 a 2^n - 1, dove ogni numero corrisponde a una maschera di bit // la maschera del numero corrente è una maschera di bit, dove l'i-esimo bit specifica lo stato dell'i-esimo oggetto for (int i = 0; i < n; i++) { // itera su n bit per capire quale stato ha ogni oggetto if ((1 << i) & mask) { // controlla se l'i-esimo bit è uguale a uno // elabora l'opzione che l'i-esimo oggetto ha lo stato '1' } else { // caso in cui l'i-esimo bit è zero // elabora l'opzione che l'i-esimo oggetto dello stato '0' } } }
Questo codice viene eseguito in O(2^n * f(n)), dove f(n) è il tempo necessario per elaborare un particolare iterabile.

Problem

Eric ha trovato una scheda LED nel vecchio garage di suo nonno. Tuttavia, è rimasto sorpreso dal fatto che, una volta attivati, i diodi non fossero sincronizzati tra loro. Cioè, alcuni di loro sono bruciati e altri no.
Il tabellone stesso si è rivelato insolito. È una griglia rettangolare con n righe e m colonne, dove ogni cella contiene un diodo. Vicino a ogni fila c'è una leva che commuta tutti i diodi in questa fila (i diodi accesi si spengono e viceversa). Ogni colonna ha le stesse leve (che uso i diodi nella colonna corrispondente).
Eric si chiedeva se fosse possibile far passare i diodi allo stesso stato spostando le leve.

Inserimento:
La prima riga contiene due numeri naturali n e m (1 <= n, m <= 7) - rispettivamente il numero di righe e di colonne sulla scacchiera.
Poi ci sono n righe con m numeri ciascuna - gli stati dei diodi, dove 0 significa che il diodo è spento e 1 che è acceso.

Uscita:
Stampa "YES" se è possibile portare i diodi in uno stato e "NO" se è impossibile.

Esempi:
 
Input Uscita
2 2
0 1
10
2 2
0 1
0 0
NO

Spiegazione:
Nel primo esempio, puoi cambiare tutti i diodi nella prima riga, quindi cambiare tutti i diodi nella prima colonna. Quindi tutti i diodi saranno spenti.