WA on 1# 2#
#include <bits/stdc++.h>
#define Code using
#define by namespace
#define zzx std
Code by zzx;
int c, t;
int n, a[100010];
long long v[19], cnt[100010][10], ans;
long long imin[7] = {0, 1, 11, 111, 1111, 11111, 111111}, imax[7] = {0, 9, 99, 999, 9999, 99999, 999999};
string s;
long long binary(int s, int x)
{
int l = s, r = n;
while(l < r)
{
int mid = ((l + r) >> 1);
if(cnt[mid][x] > cnt[l - 1][x])
{
r = mid;
}
else
{
l = mid + 1;
}
}
if(cnt[r][x] == cnt[l - 1][x])
{
return -1;
}
return r;
}
int main()
{
scanf("%d", &c);
scanf("%d", &t);
while(t--)
{
ans = 10000000000;
cin >> s;
n = s.length();
for(int i = 1; i <= n; ++i)
{
a[i] = int(s[i - 1] - '0');
for(int j = 1; j <= 9; ++j)
{
cnt[i][j] = cnt[i - 1][j];
}
++cnt[i][a[i]];
}
for(int i = 1; i <= 9; ++i)
{
scanf("%lld", &v[i]);
}
for(int len = 1; len <= min(6, n); ++len)
{
for(long long i = imin[len]; i <= imax[len]; ++i)
{
long long s = i, sum = i, w[10], ord[10], u = 0;
memset(w, 0, sizeof(w));
int p = 1, flag = 1;
while(s > 0)
{
ord[++u] = s % 10;
s /= 10;
++w[ord[u]];
}
if(w[0])
{
continue;
}
for(long long j = u; j >= 1; --j)
{
int res = binary(p, ord[j]);
if(res == -1)
{
flag = 0;
break;
}
p = res + 1;
}
if(flag == 0)
{
continue;
}
for(int j = 1; j <= 9; ++j)
{
sum += v[j] * long(cnt[n][j] - w[j]);
}
ans = min(ans, sum);
}
}
printf("%lld\n", ans);
}
return 0;
}