#include <bits/stdc++.h>
using namespace std;
char s[1010];
int pos, n, m, l, f[1010][1010], la, p[1010], b[1010][1010], a[1010],
    cost[1010], tree[11], rk[1010][1010];
bool cmp(int x, int y) {
  return b[x][pos] == b[y][pos] ? p[x] < p[y] : b[x][pos] > b[y][pos];
}
void update(int x, int v) {
  for (; x <= 10; x += x & -x) tree[x] += v;
}
int query(int x) {
  int ret = 0;
  for (; x; x -= x & -x) ret += tree[x];
  return ret;
}
int main() {
  scanf("%s", s + 1);
  m = la = strlen(s + 1);
  for (int i = 1; i <= la; i++) a[la - i + 1] = s[i] == '?' ? -1 : s[i] - '0';
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    b[i][0] = l = strlen(s + 1);
    m = max(m, l);
    for (int j = 1; j <= l; j++) b[i][l - j + 1] = s[j] - '0';
  }
  for (int i = 1; i <= n; i++) rk[0][i] = i;
  for (int i = 1; i <= m; i++) {
    for (int j = 1; j <= n; j++) rk[i][j] = j;
    pos = i;
    for (int j = 1; j <= n; j++) p[rk[i - 1][j]] = j;
    sort(rk[i] + 1, rk[i] + n + 1, cmp);
  }
  for (int i = 0; i <= 9; i++) scanf("%d", cost + i);
  memset(f, 200, sizeof f);
  f[0][0] = 0;
  for (int i = 0; i <= m; i++) {
    int kyu = 0;
    memset(tree, 0, sizeof tree);
    for (int j = 1; j <= n; j++)
      if (max(b[j][0], la) >= i + 1) update(b[j][i + 1] + 1, 1);
    for (int j = 0; j <= n; j++) {
      if (j) {
        if (max(b[rk[i][j]][0], la) >= i + 1)
          update(b[rk[i][j]][i + 1] + 1, -1);
        if (b[rk[i][j]][i + 1] == 9) kyu++;
        update((b[rk[i][j]][i + 1] + 1) % 10 + 1, 1);
      }
      if (f[i][j] >= 0) {
        int d = 0, u = 9;
        if (~a[i + 1]) d = u = a[i + 1];
        if (i + 1 == la && d == 0) d = 1;
        for (int c = d; c <= u; c++) {
          int k = query(10) - query(10 - c) + kyu;
          int w = cost[c] * query(1);
          for (int cc = 1; cc <= 9; cc++)
            w += cost[(c + cc) % 10] * (query(cc + 1) - query(cc));
          f[i + 1][k] = max(f[i + 1][k], f[i][j] + w);
        }
      }
    }
  }
  printf("%d\n", f[m + 1][0]);
}
