#include <bits/stdc++.h>
using namespace std;
static const double EPS = 1e-10;
template <typename T, typename S>
vector<T>& operator<<(vector<T>& a, S b) {
  a.push_back(b);
  return a;
}
template <typename T>
void operator>>(vector<T>& a, int b) {
  while (b--)
    if (!a.empty()) a.pop_back();
}
bool isprime(int n) {
  if (n < 2) return false;
  for (int i = 2; i * i <= n; i++)
    if (n % i == 0) return false;
  return true;
}
long long b_pow(long long x, long long n) {
  return n ? n == 1 ? x : b_pow(x, n >> 1) * b_pow(x, (n >> 1) + (n & 1)) : 1;
}
string itos(int n) {
  stringstream ss;
  ss << n;
  return ss.str();
}
vector<int> in;
int a, b, c, d, n, W, H;
vector<vector<char> > get(vector<vector<char> > data, int aa) {
  int sum = 0, skipped = 0;
  for (int i = 0; i < in.size(); i++) {
    for (int j = 0; j < in[i]; j++) {
      int t = sum + skipped;
      int x = t % W, y = t / W;
      if (y % 2 == aa) {
        x = W - 1 - x;
      }
      if (data[y][x] == '.') {
        skipped++;
        j--;
        continue;
      } else {
        data[y][x] = 'a' + i;
      }
      sum++;
    }
  }
  return data;
}
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
void dfs(char c, int x, int y, bool done[100][100],
         vector<vector<char> >& data) {
  if (x >= 0 && y >= 0 && y < H && x < W) {
    if (done[y][x] || data[y][x] != c)
      return;
    else
      done[y][x] = true;
    for (int i = 0; i < 4; i++) {
      dfs(c, x + dx[i], y + dy[i], done, data);
    }
  }
}
bool iscorrect(vector<vector<char> > data) {
  int cnt[26] = {0};
  bool done[100][100] = {0};
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if (done[i][j] == 0) {
        cnt[data[i][j] - 'a']++;
        dfs(data[i][j], j, i, done, data);
      }
    }
  }
  for (int i = 0; i < 26; i++)
    if (cnt[i] > 1) return false;
  return true;
}
int main() {
  bool sw = 0;
  cin >> a >> b >> c >> d >> n;
  in.resize(n);
  if (d > b) {
    swap(a, c);
    swap(b, d);
    sw = true;
  }
  vector<vector<char> > data(max(b, d), vector<char>(a + c, '-'));
  W = data[0].size(), H = data.size();
  int w = c, h = b - d;
  for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) data[d + i][a + j] = '.';
  int s = 0;
  for (int i = 0; i < n; i++) cin >> in[i], s += in[i];
  vector<vector<char> > one = get(data, 0);
  vector<vector<char> > two = get(data, 1);
  data = (iscorrect(one) ? one : two);
  cout << "YES" << endl;
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cout << data[i][sw ? W - 1 - j : j];
    }
    cout << endl;
  }
}
