#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const int N = 1010;
char s[N][N], a[N];
int len[N], n, mx, len1;
inline void Max(int &a, int b) {
  if (b > a) a = b;
}
inline void Max(long long &a, long long b) {
  if (b > a) a = b;
}
int c[10], Rank[N], Rank2[N], h[N], C[10];
long long f[N], rmq[N][11], tmp[N];
int v[N];
inline void pre(int p) {
  for (int i = 0; i <= n; i++) rmq[i][0] = f[i];
  int tmp = 0;
  for (int i = n; i > 0; i--) {
    tmp += C[(v[Rank2[i]] + 1) % 10];
    if (p < max(len1, len[Rank2[i]]) || v[Rank2[i]] != 0)
      tmp -= C[v[Rank2[i]] % 10];
    rmq[i - 1][0] += tmp;
  }
  for (int i = 0, j = 1; j << 1 <= n + 1; i++, j <<= 1)
    for (int k = 0; k <= n - 2 * j + 1; k++)
      rmq[k][i + 1] = max(rmq[k][i], rmq[k + j][i]);
}
inline long long RMQ(int l, int r) {
  int i, j;
  for (i = 0, j = 1; j << 1 <= r - l + 1; i++, j <<= 1)
    ;
  return max(rmq[l][i], rmq[r - j + 1][i]);
}
inline void add(int x, int p) {
  memset(v, 0, sizeof(v));
  long long cost = 0;
  for (int i = 1; i <= n; i++) {
    v[i] = x;
    if (s[i][p] >= '0' && s[i][p] <= '9') v[i] += s[i][p] - '0';
    if (p < max(len1, len[i]) || v[i] != 0) cost += C[v[i] % 10];
  }
  pre(p);
  int l, r;
  for (int i = n; i >= 0; i--) {
    l = 0, r = n;
    if ((i == 0 || v[Rank[i]] <= 9) && (i == n || v[Rank[i + 1]] >= 9)) {
      if (i > 0 && v[Rank[i]] == 9) l = max(l, h[Rank[i]]);
      if (i < n && v[Rank[i + 1]] == 9) r = min(r, h[Rank[i + 1]] - 1);
      if (l <= r) Max(tmp[i], cost + RMQ(l, r));
    }
  }
}
int main() {
  scanf("%s", a);
  len1 = strlen(a);
  Max(mx, len1);
  reverse(a, a + len1);
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%s", s[i]);
    len[i] = strlen(s[i]);
    reverse(s[i], s[i] + len[i]);
    Max(mx, len[i]);
  }
  for (int i = 0; i < 10; i++) scanf("%d", C + i);
  for (int i = 1; i <= n; i++) Rank2[i] = i;
  for (int i = 0; i < n; i++) f[i] = -INF;
  mx += 1;
  for (int i = 0; i < mx; i++) {
    memset(c, 0, sizeof(c));
    for (int j = 1; j <= n; j++)
      if (s[j][i] >= '0' && s[j][i] <= '9')
        c[s[j][i] - '0']++;
      else
        c[0]++;
    for (int j = 1; j < 10; j++) c[j] += c[j - 1];
    for (int j = 9; j > 0; j--) c[j] = c[j - 1];
    c[0] = 0;
    for (int j = 1; j <= n; j++)
      if (s[Rank2[j]][i] <= '9' && s[Rank2[j]][i] >= '0') {
        Rank[++c[s[Rank2[j]][i] - '0']] = Rank2[j];
      } else
        Rank[++c[0]] = Rank2[j];
    for (int j = 1; j <= n; j++) h[Rank2[j]] = j;
    for (int j = 0; j <= n; j++) tmp[j] = -INF;
    if (i < len1) {
      if (a[i] >= '0' && a[i] <= '9') {
        add(a[i] - '0', i);
      } else if (a[i] == '?') {
        for (int j = 0; j < 10; j++) {
          if (j == 0 && i == len1 - 1) continue;
          add(j, i);
        }
      }
    } else
      add(0, i);
    memcpy(Rank2, Rank, sizeof(Rank));
    memcpy(f, tmp, sizeof(f));
  }
  printf("%I64d\n", f[n]);
  return 0;
}
