#include <bits/stdc++.h>
using namespace std;
int IN() {
  int c, f, x;
  while (!isdigit(c = getchar()) && c != '-')
    ;
  c == '-' ? (f = 1, x = 0) : (f = 0, x = c - '0');
  while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + c - '0';
  return !f ? x : -x;
}
const int N = 1000 + 19;
long long f[N][N], res;
int rk[N][N], seq[N][N], Q[N], sum[N][10], h[N], len[N], cnt[20], val[10];
int n, top, m;
string s, t[N];
void Upd(long long &x, long long y) {
  if (y > x) x = y;
}
string getstr() {
  static char s[N];
  scanf("%s", s);
  int len = strlen(s);
  reverse(s, s + len);
  return string(s);
}
void Work(int w, int chk) {
  memset(h, 0, sizeof(h));
  memset(sum, 0, sizeof(sum));
  if (w) {
    for (int i = 1; i < n + 1; i++) {
      for (int j = 0; j < 10; j++)
        sum[i][j] = sum[i - 1][j] + (t[seq[w - 1][i]][w] == j + '0');
      h[i] = h[i - 1] + (w >= len[seq[w - 1][i]]);
    }
  } else {
    for (int i = 1; i < n + 1; i++) {
      for (int j = 0; j < 10; j++)
        sum[i][j] = sum[i - 1][j] + (t[i][w] == j + '0');
      h[i] = h[i - 1] + (w >= len[i]);
    }
  }
  for (int i = 0; i < n + 1; i++)
    if (f[w][i] >= 0) {
      for (int c = (w == top - 1); c < 10; c++)
        if (s[w] == '?' || s[w] == c + '0') {
          long long tmp = 0;
          int num = 0;
          for (int d = 0; d < 10; d++) {
            tmp += 1ll * (sum[n][d] - sum[n - i][d]) * val[(d + c + 1) % 10];
            tmp += 1ll * sum[n - i][d] * val[(d + c) % 10];
            num += (d + c + 1 >= 10) * (sum[n][d] - sum[n - i][d]);
            num += (d + c >= 10) * sum[n - i][d];
          }
          if (chk) tmp -= 1ll * h[n - i] * val[0];
          Upd(f[w + 1][num], f[w][i] + tmp);
        }
    }
}
int main() {
  s = getstr();
  top = s.length();
  m = max(m, int(s.length()));
  n = IN();
  for (int i = 1; i < n + 1; i++) {
    t[i] = getstr();
    len[i] = t[i].length();
    m = max(m, len[i]);
  }
  for (int i = 0; i < 10; i++) val[i] = IN();
  while (s.length() < m) s += "0";
  for (int i = 1; i < n + 1; i++) {
    while (t[i].length() < m) t[i] += "0";
  }
  for (int i = 1; i < n + 1; i++) Q[i] = i;
  for (int w = 0; w < m; w++) {
    memset(cnt, 0, sizeof(cnt));
    for (int i = 1; i < n + 1; i++) cnt[t[i][w] - '0']++;
    for (int i = 1; i < 10; i++) cnt[i] += cnt[i - 1];
    for (int i = n; i; i--) {
      seq[w][cnt[t[Q[i]][w] - '0']--] = Q[i];
    }
    for (int i = 1; i < n + 1; i++) Q[i] = seq[w][i];
  }
  for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++) f[i][j] = -(1ll << 60);
  f[0][0] = 0;
  for (int w = 0; w < top; w++) Work(w, 0);
  for (int w = top; w < m; w++) Work(w, 1);
  for (int i = 0; i < n + 1; i++) {
    Upd(res, f[m][i] + 1ll * i * val[1]);
  }
  cout << res << endl;
}
