#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void smax(T &x, T y) {
  x = max((x), (y));
}
template <class T>
inline void smin(T &x, T y) {
  x = min((x), (y));
}
const int MOD = 1e9 + 7;
const int SIZE = 100 + 10;
const double EPS = 1e-6;
int n;
int cnt[SIZE];
vector<pair<int, int> > b[2];
int main() {
  if (0) {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
  }
  while (scanf("%d", &(n)) == 1) {
    memset((cnt), 0, sizeof((cnt)));
    vector<pair<int, int> > v;
    for (int i = 0; i < (2 * n); ++i) {
      int(x);
      scanf("%d", &x);
      cnt[x]++;
      v.push_back(make_pair(x, i));
    }
    int cc = 0;
    set<int> s1, s2;
    for (int i = 0; i < (SIZE); ++i) {
      if (cnt[i]) {
        bool s1took = false, s2took = false;
        if (((int)(s1).size()) <= ((int)(s2).size())) {
          s1.insert(i);
          s1took = true;
        } else {
          s2.insert(i);
          s2took = true;
        }
        cnt[i]--;
        if (cnt[i]) {
          if (s1took)
            s2.insert(i);
          else
            s1.insert(i);
        }
      }
    }
    int ans1 = ((int)(s1).size()) * ((int)(s2).size());
    printf("%d\n", ans1);
    int sz1, sz2;
    sz1 = sz2 = 0;
    for (int i = 0; i < (((int)(v).size())); ++i) {
      if (s1.count(v[i].first)) {
        sz1++;
        printf("%d%c", 1, i + 1 == 2 * n ? '\n' : ' ');
        s1.erase(v[i].first);
      } else if (s2.count(v[i].first)) {
        sz2++;
        printf("%d%c", 2, i + 1 == 2 * n ? '\n' : ' ');
        s2.erase(v[i].first);
      } else {
        int sz1left = n - sz1 - ((int)(s1).size());
        if (sz1left > 0) {
          sz1++;
          printf("%d%c", 1, i + 1 == 2 * n ? '\n' : ' ');
        } else {
          sz2++;
          printf("%d%c", 2, i + 1 == 2 * n ? '\n' : ' ');
        }
      }
    }
  }
  return 0;
}
