#include <bits/stdc++.h>
using namespace std;
int n, m, c[10], l[1010], r[1010], dp[1010][1010];
char s[1010];
struct BigInt {
  int n, v[1010];
  void init(char s[]) {
    n = strlen(s + 1);
    memset(v, 0, sizeof(v));
    for (int i = 1; i <= n; i++)
      s[n - i + 1] == '?' ? r[i] = 9 : v[i] = s[n - i + 1] - '0';
  }
  BigInt operator+(const BigInt &b) const {
    BigInt Ans;
    Ans.n = max(n, b.n);
    memset(Ans.v, 0, sizeof(Ans.v));
    for (int i = 1; i <= Ans.n + 1; i++) {
      Ans.v[i] = v[i] + b.v[i] + (Ans.v[i - 1] >= 10);
      Ans.v[i - 1] -= Ans.v[i - 1] < 10 ? 0 : 10;
    }
    if (Ans.v[Ans.n + 1]) Ans.n++;
    return Ans;
  }
} A, B[1010];
int sa[1010], lst[1010];
void sort(int pos) {
  int i, sum[10];
  memcpy(lst, sa, sizeof(sa));
  memset(sum, 0, sizeof(sum));
  for (i = 1; i <= n; i++) sum[B[i].v[pos]]++;
  for (i = 1; i < 10; i++) sum[i] += sum[i - 1];
  for (i = n; i >= 1; i--) sa[sum[B[lst[i]].v[pos]]--] = lst[i];
}
int main() {
  int i, k, num;
  scanf("%s", s + 1);
  A.init(s);
  m = A.n;
  if (r[A.n]) l[A.n] = 1;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    B[i].init(s);
    B[i] = B[i] + A;
    m = max(m, B[i].n);
  }
  m++;
  for (i = 0; i < 10; i++) scanf("%d", &c[i]);
  memset(dp, -0x3f3f3f3f, sizeof(dp));
  dp[0][0] = 0;
  for (i = 1; i <= n; i++) sa[i] = i;
  for (i = 1; i <= A.n; i++) {
    sort(i - 1);
    for (num = l[i]; num <= r[i]; num++) {
      int add = 0, cnt = 0;
      for (k = 1; k <= n; k++) {
        int tmp = B[k].v[i] + num;
        cnt += c[tmp % 10];
        add += tmp >= 10;
      }
      for (k = 0; k <= n; k++) {
        if (dp[i - 1][k] >= 0) dp[i][add] = max(dp[i][add], cnt + dp[i - 1][k]);
        int tmp = B[sa[n - k]].v[i] + num;
        cnt -= c[tmp % 10];
        add -= tmp >= 10;
        tmp++;
        cnt += c[tmp % 10];
        add += tmp >= 10;
      }
    }
  }
  for (i = A.n + 1; i <= m; i++) {
    sort(i - 1);
    int add = 0, cnt = 0;
    for (k = 1; k <= n; k++) {
      int tmp = B[k].v[i];
      if (B[k].n >= i) cnt += c[tmp % 10], add += tmp >= 10;
    }
    for (k = 0; k <= n; k++) {
      if (dp[i - 1][k] >= 0) dp[i][add] = max(dp[i][add], cnt + dp[i - 1][k]);
      int tmp = B[sa[n - k]].v[i];
      if (B[sa[n - k]].n >= i) cnt -= c[tmp % 10], add -= tmp >= 10;
      tmp++;
      cnt += c[tmp % 10];
      add += tmp >= 10;
    }
  }
  int Ans = 0;
  for (k = 0; k <= n; k++) Ans = max(Ans, dp[m][k]);
  printf("%d\n", Ans);
}
