Advertisement
williammu6

Untitled

Dec 13th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. /*input
  2. 2 2
  3. (x1) and
  4. (not x2)
  5. */
  6.  
  7. #include <bits/stdc++.h>
  8.  
  9. using namespace std;
  10.  
  11. #define sz(a) ((int)(a).size())
  12. #define rep(i,a,b) for (int i = (a); i < (b); i++)
  13. #define dec(i,n,a) for (int i = (n); i >= (a); i--)
  14. #define max(a, b) ((a) > (b) ? (a) : (b))
  15. #define MAX_N 2001
  16.  
  17. typedef vector<int> vi;
  18. typedef bitset<MAX_N> bs;
  19.  
  20. bs solve(vector<bs> &U, bs b){
  21.     int n = sz(U);
  22.     int l = 0;
  23.     vi linha(n, -1);
  24.  
  25.     rep(c, 0, n) {
  26.         int r = l;
  27.  
  28.         if (U[l][c] == 0) {
  29.             rep(i, l + 1, n) {
  30.                 if (U[i][c]){
  31.                     r = i;
  32.                     break;
  33.                 }
  34.             }
  35.         }
  36.  
  37.         if (l != r) {
  38.             swap(U[l], U[r]);
  39.             swap(b[l], b[r]);
  40.         }
  41.        
  42.         if (!U[l][c]) continue;
  43.        
  44.         linha[c] = l;
  45.        
  46.         rep(i, l + 1, n) {
  47.             if(U[i][c]) {
  48.                 U[i] ^= U[l];
  49.                 b[i] = b[i] ^ b[l];
  50.             }
  51.         }
  52.  
  53.         l++;
  54.     }
  55.  
  56.     rep(i, 0, n) {
  57.         if(U[i].count() == 0 && b[i]) {
  58.             printf("impossible\n");
  59.             exit(0);
  60.         }
  61.     }
  62.  
  63.     bs x;
  64.    
  65.     dec(i, n - 1, 0) {
  66.         x[i] = linha[i] == -1 ? 1 : b[linha[i]];
  67.         if (x[i]) {
  68.             rep(j, 0, i) {
  69.                 if (U[j][i]) b[j] = b[j] ^ 1;
  70.             }
  71.         }
  72.     }
  73.     return x;
  74. }
  75.  
  76. int main() {
  77.  
  78.     int n, m, d;
  79.     vector<bs> mat;
  80.     bs x;
  81.  
  82.     scanf("%d%d", &m, &n);
  83.    
  84.     mat.resize(max(m, n));
  85.  
  86.     rep(i, 0, m) {
  87.  
  88.         scanf(" %*c");
  89.         int v = 1;
  90.  
  91.         while (1) {
  92.             char c;
  93.             scanf(" %c", &c);
  94.  
  95.             if(c == 'n') {
  96.                 scanf("%*c %*c %*c");
  97.                 v ^= 1;
  98.             }
  99.            
  100.             scanf("%d", &d);
  101.  
  102.             d--;
  103.  
  104.             mat[i][n - 1 - d] = mat[i][n - 1 - d] ^ 1;
  105.            
  106.             scanf(" %c", &c);
  107.             if(c == 'o') scanf("%*c");
  108.             else break;
  109.         }
  110.        
  111.         if(i + 1 < m) scanf(" %*c %*c %*c ");
  112.         if(v) x.set(i);
  113.     }
  114.  
  115.     x = solve(mat, x);
  116.  
  117.     rep(i, 0, n) printf(x[n - 1 - i] ? "T" : "F");
  118.  
  119.     printf("\n");
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement