#include <bits/stdc++.h>
using namespace std;
int cst[1010], a[1010][1010], mx, sorted[1010][1010], n, pos[1010][1010],
    mem[1010][1010], cc[1010], szs[1010], szc;
char c[1010], s[1010][1010];
void srt() {
  for (int i = 0; i < n; ++i) {
    sorted[0][i] = i;
  }
  for (int x = 1; x <= mx; ++x) {
    vector<int> v[10];
    for (int i = 0; i < n; ++i) {
      v[a[sorted[x - 1][i]][x]].push_back(sorted[x - 1][i]);
    }
    int cnt = 0;
    for (int i = 9; i >= 0; --i) {
      for (int j = 0; j < v[i].size(); ++j) {
        sorted[x][cnt] = v[i][j];
        pos[x][v[i][j]] = cnt;
        ++cnt;
      }
    }
  }
}
int cost[1010][1010][10], crr[1010][1010][10];
void pre() {
  int cr, tmp, res;
  for (int x = 1; x <= mx; ++x) {
    for (int i = 0; i < 10; ++i) {
      cr = -1;
      res = 0;
      for (int j = 0; j < n; ++j) {
        if (szs[sorted[x - 1][j]] < x && szc < x) continue;
        tmp = a[sorted[x - 1][j]][x] + i;
        if (tmp > 9) {
          cr = max(cr, pos[x][sorted[x - 1][j]]);
        }
        tmp = tmp % 10;
        res += cst[tmp];
      }
      cost[x][0][i] = res;
      crr[x][0][i] = cr + 1;
      for (int y = 0; y < n; ++y) {
        tmp = a[sorted[x - 1][y]][x] + i + 1;
        if (tmp > 9) {
          cr = max(cr, pos[x][sorted[x - 1][y]]);
        }
        tmp = tmp % 10;
        res += cst[tmp];
        if (szs[sorted[x - 1][y]] < x && szc < x) goto jump;
        tmp = a[sorted[x - 1][y]][x] + i;
        tmp = tmp % 10;
        res -= cst[tmp];
      jump:
        cost[x][y + 1][i] = res;
        crr[x][y + 1][i] = cr + 1;
      }
    }
  }
}
int msh = '?' - '0';
int dp(int x, int y) {
  if (x > mx) return 0;
  if (mem[x][y] != -1) return mem[x][y];
  int res = 0, ans = 0, cr, tmp;
  if (cc[x] == msh) {
    for (int i = (x == szc); i < 10; ++i) {
      res = cost[x][y][i] + dp(x + 1, crr[x][y][i]);
      ans = max(res, ans);
    }
  } else {
    int i = cc[x];
    cr = -1;
    res = 0;
    ans = cost[x][y][i] + dp(x + 1, crr[x][y][i]);
  }
  mem[x][y] = ans;
  return ans;
}
int main() {
  scanf("%s", &c);
  cin >> n;
  int sz;
  for (int i = 0; i < n; ++i) {
    scanf("%s", s[i]);
    szs[i] = strlen(s[i]);
    reverse(s[i], s[i] + szs[i]);
    mx = max(mx, szs[i]);
  }
  szc = strlen(c);
  mx = max(mx, szc);
  ++mx;
  for (int i = 0; i < n; ++i) {
    sz = strlen(s[i]);
    for (int j = 0; j < sz; ++j) {
      a[i][j + 1] = s[i][j] - '0';
    }
    for (int j = sz; j < mx; ++j) {
      a[i][j + 1] = 0;
    }
  }
  sz = strlen(c);
  reverse(c, c + sz);
  for (int i = 0; i < sz; ++i) {
    cc[i + 1] = c[i] - '0';
  }
  for (int i = sz; i < mx; ++i) {
    cc[i + 1] = 0;
  }
  for (int i = 0; i < 10; ++i) {
    scanf("%d", &cst[i]);
  }
  srt();
  memset(mem, -1, sizeof mem);
  pre();
  cout << dp(1, 0) << endl;
  return 0;
}
