#include <bits/stdc++.h>   using namespace std;   void out() {     cout.flush();     cerr << endl <<  OUT  << endl;     int bred;     cin >> bred;     exit(0);   }   void updMax(int& x, int y) {     if (y > x) x = y;   }   int sum10(int x, int y) {     x += y;     if (x >= 10) x -= 10;     return x;   }   int cs[10];   int n, m;   string a, bs[1024];   int dp[1024][1024], sorted[1024][1024], h[10], whereGo[1024][10], res[1024][10],       curc[1024];   int getCipher(const string& s, int ind) {     if (ind >= s.length()) return 0;     return s[ind] -  0 ;   }   void buildSorted() {     for (int j = 0; j < n; ++j) sorted[0][j] = j;     for (int i = 0; i < 1002; ++i) {       memset(h, 0, sizeof(h));       for (int j = 0; j < n; ++j) h[getCipher(bs[j], i)]++;       for (int j = 1; j < 10; ++j) h[j] += h[j - 1];       for (int j = n - 1; j >= 0; --j) {         int v = sorted[i][j];         sorted[i + 1][--h[getCipher(bs[v], i)]] = v;       }     }   }   int ps[1024], qs[1024], revps[1024], revqs[1024];   void calcWhereGo(int pos) {     for (int i = 0; i < n; ++i) {       ps[i] = sorted[pos][i];       qs[i] = sorted[pos + 1][i];       revps[ps[i]] = i;       revqs[qs[i]] = i;     }     for (int c = 0; c <= 9; ++c) {       int curper = n;       for (int i = 0; i < n; ++i)         if (getCipher(bs[ps[i]], pos) + c >= 10)           curper = min(curper, revqs[ps[i]]);       whereGo[n][c] = curper;       for (int i = n - 1; i >= 0; --i) {         if (getCipher(bs[ps[i]], pos) + c + 1 >= 10)           curper = min(curper, revqs[ps[i]]);         whereGo[i][c] = curper;       }     }   }   void calcRes(int pos) {     for (int c = 0; c <= 9; ++c) {       int sum = 0;       for (int i = 0; i < n; ++i) {         curc[i] = sum10(getCipher(bs[sorted[pos][i]], pos), c);         if (curc[i] == 0 && pos >= bs[sorted[pos][i]].length())           curc[i] = 0;         else           curc[i] = cs[curc[i]];         sum += curc[i];       }       res[n][c] = sum;       int cc = sum10(c, 1);       for (int i = n - 1; i >= 0; --i) {         sum -= curc[i];         curc[i] = sum10(getCipher(bs[sorted[pos][i]], pos), cc);         sum += cs[curc[i]];         res[i][c] = sum;       }     }   }   void calcDynamics() {     for (int i = 0; i <= 1001; ++i)       for (int j = 0; j <= n; ++j) dp[i][j] = -1000000000;     dp[0][n] = 0;     for (int i = 0; i <= 1000; ++i) {       calcWhereGo(i);       calcRes(i);       int l, r;       if (i >= m)         l = r = 0;       else if (a[i] ==  ? ) {         r = 9;         l = (i == m - 1);       } else         l = r = a[i] -  0 ;       for (int j = 0; j <= n; ++j)         for (int c = l; c <= r; ++c)           updMax(dp[i + 1][whereGo[j][c]], dp[i][j] + res[j][c]);     }   }   void solve() {     cin >> a >> n;     reverse(a.begin(), a.end());     m = a.length();     for (int i = 0; i < n; ++i) {       cin >> bs[i];       reverse(bs[i].begin(), bs[i].end());       while (bs[i].length() < m) bs[i].push_back( 0 );     }     for (int i = 0; i < 10; ++i) cin >> cs[i];     buildSorted();     calcDynamics();     int ans = 0;     for (int i = 0; i <= n; ++i) ans = max(ans, dp[1001][i]);     cout << ans <<   n ;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     solve();     out();     return 0;   }