#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
int main() {
  string a;
  getline(cin, a);
  int n;
  int m = a.size();
  reverse((a).begin(), (a).end());
  std::vector<int> c(10);
  scanf("%d\n", &n);
  std::vector<string> b(n);
  for (int i = 0; i < n; i++) {
    getline(cin, b[i]);
    reverse((b[i]).begin(), (b[i]).end());
  }
  for (int i = 0; i < 10; i++) scanf("%d", &c[i]);
  std::vector<std::vector<int> > ord(1100);
  for (int i = 0; i < n; i++) ord[0].push_back(i);
  for (int d = 1; d < 1010; d++) {
    std::vector<int> pos(n);
    std::vector<int> nd(n, 0);
    for (int i = 0; i < n; i++) pos[ord[d - 1][i]] = i;
    for (int i = 0; i < n; i++)
      if (b[i].size() >= d) nd[i] = b[i][d - 1] - '0';
    for (int dd = 0; dd < 10; dd++) {
      for (int i = 0; i < n; i++)
        if (nd[ord[d - 1][i]] == dd) ord[d].push_back(ord[d - 1][i]);
    }
  }
  int INF = 2e9;
  std::vector<std::vector<int> > d(1100, std::vector<int>(1100, -INF));
  d[0][0] = 0;
  for (int i = 0; i < m; i++) {
    std::vector<int> cnt(10, 0);
    for (int j = 0; j < n; j++) {
      if (b[j].size() <= i)
        cnt[0]++;
      else
        cnt[b[j][i] - '0']++;
    }
    int per = 0;
    for (int j = 0; j < n + 1; j++) {
      int cp = per;
      for (int dig = 0; dig < 10; dig++) {
        if (a[i] != '?' && a[i] != ('0' + dig)) {
          cp += cnt[9 - dig];
          continue;
        }
        if (i == m - 1 && dig == 0) {
          cp += cnt[9 - dig];
          continue;
        }
        int add = 0;
        for (int dwas = 0; dwas < 10; dwas++)
          add += cnt[dwas] * c[(dwas + dig) % 10];
        d[i + 1][cp] = max(d[i + 1][cp], d[i][j] + add);
        cp += cnt[9 - dig];
      }
      if (j == n) break;
      int inc = ord[i][n - 1 - j];
      int dig = 0;
      if (b[inc].size() > i) dig = b[inc][i] - '0';
      if (dig == 9) per++;
      cnt[dig]--;
      cnt[(dig + 1) % 10]++;
    }
  }
  int best = 0;
  int over = 0;
  for (int i = 0; i < n; i++) {
    for (int k = m; k < b[i].size(); k++) over += c[b[i][k] - '0'];
  }
  for (int i = 0; i < n + 1; i++) {
    best = max(d[m][i] + over, best);
    if (i == n) break;
    int ind = ord[m][n - 1 - i];
    for (int k = m; k < b[ind].size(); k++) over -= c[b[ind][k] - '0'];
    int carry = 1;
    for (int k = m; k < b[ind].size(); k++) {
      int nd = (b[ind][k] - '0') + carry;
      if (nd == 10) {
        nd = 0;
      } else
        carry = 0;
      over += c[nd];
    }
    if (carry == 1) over += c[1];
  }
  cout << best;
}
