#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + c - '0';
    c = getchar();
  }
  return x * f;
}
int n, a[200020], mx, c[200020], t[200020];
struct Basis {
  int d[19], p[19], sz;
  void clear() {
    memset(d, 0, sizeof(d));
    memset(p, 0, sizeof(p));
    sz = 0;
  }
  int Insert(int x) {
    int now = (1 << sz);
    for (int i = 18; i >= 0; --i) {
      if (x >> i & 1) {
        if (!d[i]) {
          d[i] = x, p[i] = now;
          return sz++;
        } else {
          x ^= d[i], now ^= p[i];
        }
      }
    }
    return -1;
  }
  int Ask(int x) {
    int now = 0;
    for (int i = 18; i >= 0; --i) {
      if (x >> i & 1) {
        x ^= d[i];
        now ^= p[i];
      }
    }
    return now;
  }
} B;
int main() {
  n = read();
  for (int i = 1; i <= n; ++i) {
    a[i] = read();
  }
  for (int k = 18; k >= 0; --k) {
    B.clear();
    for (int i = 1; i <= n; ++i) {
      if (a[i] < (1 << k)) {
        int x = B.Insert(a[i]);
      }
    }
    if (B.sz == k) {
      mx = k;
      break;
    }
  }
  for (int i = 0; i < (1 << mx); ++i) {
    t[B.Ask(i)] = i;
  }
  vector<int> h(1, 0);
  for (int i = 0; i < mx; ++i) {
    vector<int> g = h;
    for (auto &x : g) x |= 1 << i;
    reverse(g.begin(), g.end());
    h.insert(h.end(), g.begin(), g.end());
  }
  printf("%d\n", mx);
  for (int i = 0; i < (1 << mx); ++i) {
    printf("%d ", t[h[i]]);
  }
  return 0;
}
