Advertisement
Guest User

Untitled

a guest
May 11th, 2015
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <bitset>
  4. #include <stdio.h>
  5.  
  6. using namespace std;
  7.  
  8. ostream& operator<< ( ostream& os, const vector<uint32_t>& v )
  9. {
  10.   for( auto it = v.begin(); it != v.end(); it++ )
  11.   {
  12.     os << *it << "\n";
  13.   }
  14.   return os;
  15. }
  16.  
  17. inline bitset<15> make_pattern()
  18. {
  19.   char field;
  20.   bitset<15> pattern;
  21.  
  22.   for( uint32_t offset = 0; offset < 3; offset++ )
  23.   {
  24.     cin >> field;
  25.     if( field == 'x' ) pattern.set(offset);
  26.  
  27.     cin >> field;
  28.     if( field == 'x' ) pattern.set(offset + 5);
  29.  
  30.     cin >> field;
  31.     if( field == 'x' ) pattern.set(offset + 10);
  32.   }
  33.   return pattern;
  34. }
  35.  
  36. int main()
  37. {
  38.   uint32_t n, m, p;
  39.   cin >> n;
  40.   cin >> p;
  41.   cin >> m;
  42.  
  43.   vector<bool> forbidden_patterns( 33000 );
  44.  
  45.   for( uint32_t i = 0; i < p; i++ )
  46.   {
  47.     auto pattern = make_pattern();
  48.     forbidden_patterns[pattern.to_ulong()] = true;  // true := forbidden; false := allowed.
  49.     forbidden_patterns[(pattern << 1).to_ulong()] = true;
  50.     forbidden_patterns[(pattern << 2).to_ulong()] = true;
  51.     //cout << forbidden_patterns[(pattern<<3).to_ulong()];
  52.     //cout << pattern.to_ulong();
  53.   }
  54.  
  55.   for( uint32_t i = 0; i< 33000; i++ ) //checking the contents of the forbidden_patterns vector
  56.   {
  57.     bitset<15> bs = i;
  58.     if(forbidden_patterns[i] == true)
  59.       cout << bs << "\n";
  60.   }
  61.   cout << "\n\n";
  62.  
  63.   //bitmasks for setting 2 rows of a 3 column pattern to 0;
  64.   bitset<15> bottom_rows_reset_mask;
  65.   bottom_rows_reset_mask.set(3); bottom_rows_reset_mask.set(8); bottom_rows_reset_mask.set(13);
  66.   bottom_rows_reset_mask.set(4); bottom_rows_reset_mask.set(9); bottom_rows_reset_mask.set(14);
  67.   bottom_rows_reset_mask = ~bottom_rows_reset_mask;
  68.  
  69.   bitset<15> top_rows_reset_mask;
  70.   top_rows_reset_mask.set(0); top_rows_reset_mask.set(5); top_rows_reset_mask.set(10);
  71.   top_rows_reset_mask.set(1); top_rows_reset_mask.set(6); top_rows_reset_mask.set(11);
  72.   top_rows_reset_mask = ~top_rows_reset_mask;
  73.  
  74.   bitset<15> top_and_bottom_reset_mask;
  75.   top_and_bottom_reset_mask.set(0); top_and_bottom_reset_mask.set(5); top_and_bottom_reset_mask.set(10);
  76.   top_and_bottom_reset_mask.set(4); top_and_bottom_reset_mask.set(9); top_and_bottom_reset_mask.set(14);
  77.   top_and_bottom_reset_mask = ~top_and_bottom_reset_mask;
  78.  
  79.   vector<uint32_t> left( 1024, 1 );
  80.   vector<uint32_t> right( 1024, 0 );
  81.  
  82.   for( uint32_t column = 3; column <= n; column++ )
  83.   {
  84.     for( uint32_t first_2_columns = 0; first_2_columns < 1024; first_2_columns++ )
  85.     {
  86.       if( left[first_2_columns] == 0 ) continue;
  87.       for( uint32_t third_column = 0; third_column < 32; third_column++ )
  88.       {
  89.         bitset<15> t_patt = (first_2_columns | third_column << 10) & top_and_bottom_reset_mask.to_ulong();
  90.         //cout << t_patt << "\n"; //getchar();
  91.         if( forbidden_patterns[t_patt.to_ulong()] == true )
  92.         {
  93.           //cout << t_patt << "\n"; getchar();
  94.           continue;
  95.         }
  96.  
  97.         t_patt = (first_2_columns | third_column << 10) & bottom_rows_reset_mask.to_ulong();
  98.         //cout << t_patt << "\n"; //getchar();
  99.         if( forbidden_patterns[t_patt.to_ulong()] == true )
  100.         {
  101.           //cout << t_patt << "\n"; getchar();
  102.           continue;
  103.         }
  104.  
  105.         t_patt = (first_2_columns | third_column << 10) & top_rows_reset_mask.to_ulong();
  106.         //cout << t_patt << "\n"; //getchar();
  107.         if( forbidden_patterns[t_patt.to_ulong()] == true )
  108.         {
  109.           //cout << t_patt << "\n"; getchar();
  110.           continue;
  111.         }
  112.  
  113.         t_patt = first_2_columns | third_column << 10;
  114.         //cout << t_patt << "\n";
  115.         auto next_2_column_pattern = (t_patt >> 5).to_ulong();
  116.         //t_patt = next_2_column_pattern; cout << t_patt << "\n"; getchar();
  117.         right[next_2_column_pattern] = (right[next_2_column_pattern] + left[first_2_columns]) % m;
  118.       }
  119.     }
  120.     left.swap(right);
  121.     right.assign(1024, 0u);
  122.   }
  123.   uint32_t sum = 0;
  124.   for( int i = 0; i < 1024; i++ )
  125.     sum = (sum + left[i]) % m;
  126.  
  127.   cout << sum;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement