func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = (int)1e9 + 7;   const int MAXN = (int)1003;   const int LOG = (int)11;   const int infint = (int)1e9 + 3;   const long long inf = (long long)1e12;   string A, B[MAXN];   int cost[MAXN], dp[MAXN][MAXN], last[MAXN], n, mx, sza;   pair<int, int> radix[MAXN];   void build() {     memset(dp, -63, sizeof dp);     for (auto &ch : A) ch -=  0 ;     mx++;     reverse(A.begin(), A.end());     sza = A.size();     while ((int)A.size() < mx) A += (char)(0);     for (int i = 0; i < n; i++) {       last[i] = B[i].size();       reverse(B[i].begin(), B[i].end());       while ((int)B[i].size() < mx) B[i] +=  0 ;       radix[i] = {B[i][0], i};     }     sort(radix, radix + n);     reverse(radix, radix + n);   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     cin >> A >> n;     mx = A.size();     for (int i = 0; i < n; i++) {       cin >> B[i];       mx = max(mx, (int)B[i].size());     }     for (int i = 0; i < 10; i++) cin >> cost[i];     build();     dp[0][0] = 0;     for (int i = 0; i < mx; i++) {       int l, r;       if (A[i] ==  ?  -  0 )         l = 0, r = 9;       else         l = r = A[i];       if (i == sza - 1 && A[i] ==  ?  -  0 ) l = 1;       for (int k = l; k <= r; k++) {         int pt = 0, add = 0;         for (int j = 0; j < n; j++) {           int ind = radix[j].second;           int nxt = B[ind][i] -  0  + k;           if (nxt >= 10) pt++;           if (max(last[ind], sza) > i || nxt > 0) add += cost[nxt % 10];         }         for (int j = 0; j <= n; j++) {           dp[i + 1][pt] = max(dp[i + 1][pt], dp[i][j] + add);           if (j == n) continue;           int ind = radix[j].second;           int nxt = B[ind][i] -  0  + k;           if (nxt == 9) pt++;           if (max(last[ind], sza) > i || nxt > 0) add -= cost[nxt % 10];           add += cost[(nxt + 1) % 10];         }       }       reverse(radix, radix + n);       for (int j = 0; j < n; j++) {         int ind = radix[j].second;         radix[j].first = n * B[ind][i] + j;       }       sort(radix, radix + n);       reverse(radix, radix + n);     }     cout << dp[mx][0];   }   