#include #define FOR(i, a, b) for (int i = (a); i < (b); i++) #define REP(i, n) FOR(i, 0, n) #define ll long long using namespace std; const int MAXN = 100100; ll val[30]; char arr[MAXN]; int n; int pot[MAXN]; ll maxi; ll prost; ll solve(int x, int step) { char tr = '?'; int t = x, flag = 1; REP(i, n / step) { if (arr[t] != '?') { if (tr == '?') tr = arr[t]; else if (tr != arr[t]) flag = 0; } if (!flag) break; t = (t + step) % n; } ll out = 0; if (flag) { ll steps_left = pot[n / step] + 1; if (tr == '?') out = steps_left * (n / step) * maxi; else out = steps_left * (n / step) * val[tr - 'A']; } ll out2 = 0; if (step < n) { REP(i, prost) { out2 += solve((x + i * step) % n, step * prost); } } return max(out, out2); } int main() { ios_base::sync_with_stdio(false); cin >> n; FOR(i, 2, n + 1) { if (n % i == 0) { prost = i; break; } } assert(prost > 1); ll tr = 1; int ind = 0; while (tr <= n) { pot[tr] = ind; tr *= prost; ind++; } string s; cin >> s; REP(i, n) arr[i] = s[i]; int k; cin >> k; REP(i, k) { char c; int v; cin >> c >> v; val[c - 'A'] = v; if (v >= maxi) maxi = v; } cout << solve(0, 1) << "\n"; return 0; }