#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 10;
int n, m;
int num[N][10], len, mlen, tmp[10];
char str[10];
void read(int x, int i) {
  if (x + 1 <= len) read(x + 1, i);
  tmp[x] = 0;
  if (str[x] != '?') {
    num[i][++num[i][0]] = str[x] - '0';
  } else
    num[i][++num[i][0]] = -1;
}
bool dfs(int x, int i) {
  if (!x) {
    return 0;
  }
  if (num[i][x] >= 0) {
    if (num[i][x] > num[i - 1][x]) return 1;
    if (num[i][x] < num[i - 1][x]) return 0;
    return dfs(x - 1, i);
  } else {
    if (x != len || num[i - 1][x] != 0) {
      if (dfs(x - 1, i)) {
        tmp[x] = num[i - 1][x];
        return 1;
      }
    }
    if (num[i - 1][x] < 9) {
      tmp[x] = num[i - 1][x] + 1;
      return 1;
    } else
      return 0;
  }
}
int scan() {
  int i = 0;
  scanf("%d", &i);
  return i;
}
int main() {
  int i, j;
  n = scan();
  bool ok = 1;
  for (i = 1; i <= n; i++) {
    scanf("%s", str + 1);
    len = strlen(str + 1);
    if (len > mlen) mlen = len;
    read(1, i);
    if (!dfs(mlen, i)) ok = 0;
    if (!ok) {
      printf("NO\n");
      return 0;
    }
    for (j = 1; j <= len; j++)
      if (num[i][j] < 0) num[i][j] = tmp[j];
  }
  printf("YES\n");
  for (i = 1; i <= n; i++) {
    for (j = num[i][0]; j; j--) printf("%d", num[i][j]);
    printf("\n");
  }
  return 0;
}
