#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3fffffff;
const long long _INF = 0x7ffffffffffffffll;
const double EPS = 1e-9;
const double PI = acos(-1.0);
template <class T, class INT>
inline T pow(T x, INT y) {
  T res(1);
  for (T tt(x); y; y /= 2) {
    if (y & 1) res *= tt;
    tt *= tt;
  }
  return res;
}
template <class T, class INT>
inline T pow(T x, INT y, T p) {
  T res(1);
  for (T tt(x); y; y /= 2) {
    if (y & 1) res = res * tt % p;
    tt = tt * tt % p;
  }
  return res;
}
int toInt(string s) {
  int x = 0;
  istringstream sin(s);
  sin >> x;
  return x;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
template <class INT>
inline INT gcd(INT x, INT y) {
  return y ? gcd(y, x % y) : x;
}
template <class INT>
inline int calc_bits(INT x) {
  return x ? (x & 1) + calc_bits(x >> 1) : 0;
}
const int MAXN = 1000 + 10;
int n, m, p[MAXN], a[MAXN], b[MAXN];
bool check;
vector<string> que;
void dfs(string s, int x) {
  if (x > m || que.size() == n) return;
  if (b[x])
    --b[x], que.push_back(s + "0");
  else
    dfs(s + "0", x + 1);
  if (b[x])
    --b[x], que.push_back(s + "1");
  else
    dfs(s + "1", x + 1);
}
int main(int argc, char* argv[]) {
  cin >> n;
  for (int i = 0; i < (n); ++i)
    cin >> p[i], m = m > (p[i]) ? m : (p[i]), ++a[p[i]];
  memcpy(b, a, sizeof(b));
  for (int i = (m); i > (0); --i) a[i - 1] += a[i] / 2, a[i] %= 2;
  for (int i = (1); i < (m + 1); ++i)
    if (a[i]) check = true;
  if (a[0] && check) {
    cout << "NO" << endl;
    return 0;
  }
  cout << "YES" << endl;
  dfs("", 1);
  for (int i = 0; i < (n); ++i)
    for (int j = 0; j < (que.size()); ++j)
      if (que[j].size() == p[i]) {
        cout << que[j] << endl;
        que.erase(que.begin() + j);
        break;
      }
}
