zoukankan      html  css  js  c++  java
  • 线性基模板

    struct Base {
      
      static const int maxN = 62;//int-31 or long long-62
      
      int tot, flag;
      LL d[maxN + 5];
      LL nd[maxN + 5];
      
      Base() {
        tot = flag = 0;
        memset(d, 0, sizeof d);
        memset(nd, 0, sizeof nd);
      }
    
      bool ins(LL x) {
        for (int i = maxN; ~i; i--) {
          if (x & (1LL << i)) {
            if (d[i]) {
              x ^= d[i];
            } else {
              d[i] = x;
              return true;
            }
          }
        }
        flag = 1;
        return false;
      }
      
      bool canIns(LL x) {
        for (int i = maxN; ~i; i--) {
          if (x & (1LL << i)) {
            if (d[i]) {
              x ^= d[i];
            } else {
              return true;
            }
          }
        }
        return false;
      }
    
      LL queryMax() {
        LL ans = 0;
        for (int i = maxN; ~i; i--) ans = max(ans, ans ^ d[i]);
        return ans;
      }
    
      LL queryMin() {
        for (int i = 0; i <= maxN; i++) if (d[i]) return d[i];
        return -1LL;
      }
    
      void rebuild() {//ÇókthÇ°, ÏÈrebuild 
        for (int i = maxN; ~i; i--) {
          for (int j = i - 1; ~j; j--) {
            if (d[i] & (1LL << j)) d[i] ^= d[j];
          }
        }
        for (int i = 0; i <= maxN; i++) if (d[i])
            nd[tot++] = d[i];
      }
    
      LL kth(LL k) {
        if (flag) k--;
        if (!k) return 0LL;
        if (k >= (1LL << tot)) return -1LL;
        LL ans = 0;
        for (int i = maxN; ~i; i--) {
          if (k & (1LL << i)) ans ^= nd[i];
        }
        return ans;
      }
    
      void merge(Base b) {//ÓëbÈ¡²¢¼¯
        for (int i = maxN; ~i; i--) if (b.d[i])
            ins(b.d[i]);
      }
    
      Base mixed(Base B) {//ÓëbÈ¡½»¼¯
        Base All, C, D;
      //  All.init(), C.init(), D.init();
        for (int i = maxN; ~i; i--) {
          All.d[i] = d[i];
          D.d[i] = 1LL << i;
        }
        for (int i = maxN; ~i; i--) {
          if (B.d[i]) {
            LL v = B.d[i], k = 0;
            bool can = true;
            for (int j = maxN; ~j; j--) {
              if (v & (1LL << j)) {
                if (All.d[j]) {
                  v ^= All.d[j];
                  k ^= D.d[j];
                } else {
                  can = false;
                  All.d[j] = v;
                  D.d[j] = k;
                  break;
                }
              }
            }
    
            if (can) {
              LL v = 0;
              for (int j = maxN; ~j; j--) {
                if (k & (1LL << j)) {
                  v ^= d[j];
                }
              }
              C.ins(v);
            }
          }
        }
        return C;
      }
    
    } lb;
    
    
  • 相关阅读:
    实例说明Java中的null(转)
    Java中初始变量默认值
    Java中finally关键字的使用(转)
    java作用域
    import static和import的区别
    static class
    [APUE]标准IO库(下)
    [APUE]标准IO库(上)
    [APUE]文件和目录(下)
    [APUE]文件和目录(中)
  • 原文地址:https://www.cnblogs.com/ChaseNo1/p/11750069.html
Copyright © 2011-2022 走看看