#include static char S[100002]; static long long V[26]; static long long recurse(int s, int d, int p, int n, char ft, char mt) { if (d > n) return 0; char t = ft; for (int j = s; j < n; j += d) { if (t == '?') t = S[j]; else if (S[j] != t && S[j] != '?') { t = 0; break; } } long long r1 = 0, r2 = 0; if (t) { if (t == '?') t = mt; r1 = V[t-'A'] * (n / d); } for (int j = 0; j < p; j++) { if (t) r1 += recurse(s + j * d, d * p, p, n, t, mt); r2 += recurse(s + j * d, d * p, p, n, ft, mt); } return (r1 > r2 ? r1 : r2); } int main() { int n = 0, k = 0, p = 2, mt = 'A'; scanf("%d %s %d ", &n, S, &k); while ((k--) > 0) { char t = getchar(); scanf("%lld ", &V[t-'A']); if (V[t-'A'] > V[mt-'A']) mt = t; } while (p < n && n % p != 0) p++; printf("%llu\n", recurse(0, 1, p, n, '?', mt)); return 0; }