#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const double eps = 1e-9;
int main() {
  int n;
  cin >> n;
  long long a[202];
  for (int i = (0); i < (2 * n); i++) {
    cin >> a[i];
  }
  set<int> fst, snd, mult;
  set<int> vfst, vsnd, vmult;
  for (int i = (0); i < (2 * n); i++) {
    if (!((vfst).find((a[i])) != (vfst).end())) {
      fst.insert(i);
      vfst.insert(a[i]);
    } else if (!((vsnd).find((a[i])) != (vsnd).end())) {
      snd.insert(i);
      vsnd.insert(a[i]);
    } else {
      mult.insert(i);
      vmult.insert(a[i]);
    }
  }
  long long cnt1 = int((snd).size()), cnt2 = int((snd).size()),
            choice = int((fst).size()) - int((snd).size());
  cnt1 += choice / 2;
  cnt2 += choice - (choice / 2);
  cout << (cnt1 * cnt2) << endl;
  long long free1 = choice / 2;
  int b[202];
  memset(b, 0, sizeof(b));
  for (__typeof__((snd).begin()) it = (snd).begin(); it != (snd).end(); it++)
    b[*it] = 2;
  for (__typeof__((fst).begin()) it = (fst).begin(); it != (fst).end(); it++) {
    if (((vsnd).find((a[*it])) != (vsnd).end())) b[*it] = 1;
  }
  for (__typeof__((fst).begin()) it = (fst).begin(); it != (fst).end(); it++) {
    if (!((vsnd).find((a[*it])) != (vsnd).end())) {
      if (free1 > 0) {
        free1--;
        b[*it] = 1;
      } else {
        b[*it] = 2;
      }
    }
  }
  free1 = n - cnt1;
  for (__typeof__((mult).begin()) it = (mult).begin(); it != (mult).end();
       it++) {
    if (free1 > 0) {
      free1--;
      b[*it] = 1;
    } else {
      b[*it] = 2;
    }
  }
  for (int i = (0); i < (2 * n); i++) {
    assert(b[i] != 0);
    if (i > 0) {
      printf(" ");
    }
    printf("%d", b[i]);
  }
  printf("\n");
  return 0;
}
