#include <bits/stdc++.h>
using namespace std;
int a[1010], cnt[1010];
int f[1010], n, id[1010], st[1010];
string str[1010];
vector<string> vet[1010];
int main() {
  int i, j, k;
  int now;
  while (scanf("%d", &n) != EOF) {
    for (i = 1; i <= n; i++) {
      scanf("%d", &a[i]);
    }
    memset(cnt, 0, sizeof(cnt));
    for (i = 1; i <= n; i++) {
      cnt[a[i]]++;
    }
    for (i = 1; i <= 1001; i++) {
      f[i] = 0;
    }
    for (i = 1000; i >= 1; i--) {
      f[i] = (f[i + 1] + 1) / 2 + cnt[i];
    }
    int flag = 1;
    for (i = 1; i <= 1000; i++) {
      if (i <= 30 && f[i] > (1 << i)) {
        flag = 0;
        break;
      }
    }
    if (flag == 0) {
      printf("NO\n");
      continue;
    }
    printf("YES\n");
    for (i = 1000; i >= 1; i--) {
      vet[i].clear();
      if (cnt[i] == 0) continue;
      for (j = 1; j <= cnt[i]; j++) {
        str[j] = "";
        id[j] = j + f[i] - cnt[i];
      }
      for (j = i; j >= 1; j--) {
        for (k = 1; k <= cnt[i]; k++) {
          if (id[k] % 2 == 0) {
            str[k] += '0';
          } else
            str[k] += '1';
          id[k] = (id[k] + 1) / 2;
        }
      }
      for (j = 1; j <= cnt[i]; j++) {
        vet[i].push_back(str[j]);
      }
    }
    for (i = 1; i <= 1000; i++) {
      st[i] = 0;
    }
    for (i = 1; i <= n; i++) {
      for (j = 0; j < a[i]; j++) {
        printf("%c", vet[a[i]][st[a[i]]][a[i] - j - 1]);
      }
      st[a[i]]++;
      putchar('\n');
    }
  }
  return 0;
}
