Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define sc( x ) scanf( "%d" , &x )
- #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
- #define clr( t , val ) memset( t , val , sizeof( t ) )
- #define pb push_back
- #define all( v ) v.begin() , v.end()
- #define SZ( v ) ((int)(v).size())
- #define mp make_pair
- #define fi first
- #define se second
- #define N 4000
- #define IT 2
- typedef long long ll;
- typedef bitset< N > bs;
- typedef vector< bs > vbs;
- typedef vector< vbs > vvbs;
- typedef pair< int , int > pii;
- char S[ N + 5 ];
- void doit( bs &v , char c , int &last ){
- if( c == '0' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
- if( c == '1' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
- if( c == '2' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
- if( c == '3' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
- if( c == '4' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
- if( c == '5' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
- if( c == '6' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
- if( c == '7' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
- if( c == '8' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
- if( c == '9' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
- if( c == 'A' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
- if( c == 'B' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
- if( c == 'C' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
- if( c == 'D' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
- if( c == 'E' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
- if( c == 'F' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
- }
- bs f( int len , int n ){
- bs vec;
- int last = 0;
- REP( i , len ) doit( vec , S[ i ] , last );
- for( int j = len - 1 ; j >= n ; ++j ) vec.set( j , 0 );
- return vec;
- }
- void impr( bs &v , int n ){
- REP( i , n ) cout << v[ i ] << " " ; cout << endl;
- }
- bs eval( vbs mat , bs v , int n ){
- bs vec;
- REP( i , n ){
- REP( j , n ) if( mat[ i ][ j ] && v[ j ] ) vec.flip( i );
- vec[ i ] = vec[ i ] & 1;
- }
- return vec;
- }
- bool check( vbs &A , vbs &B , vbs &C , bs &v , int n ){
- bs x = eval( A , eval( B , v , n ) , n );
- bs y = eval( C , v , n );
- REP( i , n ) if( x[ i ] != y[ i ] ) return 0;
- return 1;
- }
- int main(){
- freopen("matrix.in", "r", stdin);
- freopen("matrix.out", "w", stdout);
- srand( time( 0 ) );
- int n;
- while( sc( n ) == 1 ){
- int len = 1 + (n - 1)/4;
- vvbs T;
- REP( i , 3 ){
- vbs mat;
- REP( j , n ){
- scanf( "%s" , S );
- bs v = f( len , n );
- //impr( v , n );
- mat.pb( v );
- }
- T.pb( mat );
- }
- bool ok = 1;
- REP( it , IT ){
- bs vec;
- REP( i , n ) vec[ i ] = rand() & 1;
- //if( it == 0 ) REP( i , n ) vec[ i ] = i & 1;
- //else REP( i , n ) vec[ i ] = rand() & 1;
- if( !check( T[ 0 ] , T[ 1 ] , T[ 2 ] , vec , n ) ){
- ok = 0;
- break;
- }
- }
- puts( ok ? "YES" : "NO" );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment