#include using namespace std; using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template auto& operator<<(ostream &o, pair p) { return o << '(' << p.first << ", " << p.second << ')'; } template auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif const int ALPH = 26; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, k; char ch; string s; cin >> n >> s >> k; vector val(ALPH); REP(i, k) { cin >> ch; cin >> val[ch - 'A']; } int prime = 1; FOR(i, 2, n) { if (n % i == 0) { prime = i; break; } } int cnt = 1, pwr = 1; while (pwr != n) { pwr *= prime; cnt++; } int jump = n, sign; vector > dp(n); vector final(n); REP(i, n) dp[i].resize(ALPH); for (int i = cnt - 1; i >= 0; i--) { REP(j, n) { sign = s[j] - 'A'; if (s[j] == '?') { REP(l, ALPH) dp[j][l] = val[l]; if (j >= jump) { REP(l, ALPH) { dp[j][l] += dp[j - jump][l]; if (dp[j - jump][l] == 0) dp[j][l] = 0; } } } else { dp[j][sign] = val[sign]; if (j >= jump) { dp[j][sign] += dp[j - jump][sign]; if (dp[j - jump][sign] == 0) dp[j][sign] = 0; } } } LL mx, psum; REP(j, jump) { mx = 0; REP(l, ALPH) mx = max(mx, dp[n - jump + j][l]); if (jump == n) final[j] = mx; else { psum = 0; REP(l, prime) psum += final[l * jump + j]; final[j] = max(mx * (LL) (cnt - i), psum); } } jump /= prime; REP(j, n) fill(dp[j].begin(), dp[j].end(), 0); } cout << final[0] << '\n'; return 0; }