BoxerTC

Untitled

Mar 8th, 2015
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.51 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin()  , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define N 4000
  17. #define IT 2
  18.  
  19. typedef long long ll;
  20. typedef bitset< N > bs;
  21. typedef vector< bs > vbs;
  22. typedef vector< vbs > vvbs;
  23. typedef pair< int , int > pii;
  24.  
  25. char S[ N + 5 ];
  26. void doit( bs &v , char c , int &last ){
  27.     if( c == '0' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
  28.     if( c == '1' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
  29.     if( c == '2' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );   
  30.     if( c == '3' ) v.set( last ++ , 0 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
  31.     if( c == '4' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
  32.     if( c == '5' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
  33.     if( c == '6' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
  34.     if( c == '7' ) v.set( last ++ , 0 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
  35.     if( c == '8' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
  36.     if( c == '9' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
  37.     if( c == 'A' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
  38.     if( c == 'B' ) v.set( last ++ , 1 ) , v.set( last ++ , 0 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
  39.     if( c == 'C' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 0 );
  40.     if( c == 'D' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 0 ) ,v.set( last ++ , 1 );
  41.     if( c == 'E' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 0 );
  42.     if( c == 'F' ) v.set( last ++ , 1 ) , v.set( last ++ , 1 ) , v.set( last ++ , 1 ) ,v.set( last ++ , 1 );
  43. }
  44. bs f( int len , int n ){
  45.     bs vec;
  46.     int last = 0;
  47.     REP( i , len ) doit( vec , S[ i ] , last );
  48.     for( int j = len - 1 ; j >= n ; ++j ) vec.set( j , 0 );
  49.     return vec;
  50. }
  51.  
  52. void impr( bs &v , int n ){
  53.     REP( i , n ) cout << v[ i ] << " " ; cout << endl;
  54. }
  55.  
  56. bs eval( vbs mat , bs v , int n ){
  57.     bs vec;
  58.     REP( i , n ){
  59.         REP( j , n ) if( mat[ i ][ j ] && v[ j ] ) vec.flip( i );
  60.         vec[ i ] = vec[ i ] & 1;
  61.     }
  62.     return vec;
  63. }
  64. bool check( vbs &A , vbs &B , vbs &C , bs &v , int n ){
  65.     bs x = eval( A , eval( B , v , n ) , n );
  66.     bs y = eval( C , v , n );
  67.     REP( i , n ) if( x[ i ] != y[ i ] ) return 0;
  68.     return 1;
  69. }
  70. int main(){
  71.     freopen("matrix.in", "r", stdin);
  72.     freopen("matrix.out", "w", stdout);
  73.     srand( time( 0 ) );
  74.     int n;
  75.     while( sc( n ) == 1 ){
  76.         int len = 1 + (n - 1)/4;
  77.         vvbs T;
  78.         REP( i , 3 ){
  79.             vbs mat;
  80.             REP( j , n ){
  81.                 scanf( "%s" , S );
  82.                 bs v = f( len , n );
  83.                 //impr( v , n );
  84.                 mat.pb( v );               
  85.             }
  86.             T.pb( mat );
  87.         }
  88.        
  89.         bool ok = 1;
  90.         REP( it , IT ){
  91.             bs vec;
  92.             REP( i , n ) vec[ i ] = rand() & 1;
  93.             //if( it == 0 ) REP( i , n ) vec[ i ] = i & 1;
  94.             //else REP( i , n ) vec[ i ] = rand() & 1;
  95.             if( !check( T[ 0 ] , T[ 1 ] , T[ 2 ] , vec , n ) ){
  96.                 ok = 0;
  97.                 break;
  98.             }
  99.         }
  100.         puts( ok ? "YES" : "NO" );
  101.     }      
  102. }
Advertisement
Add Comment
Please, Sign In to add comment