#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; int val[30]; char arr[MAXN]; int n; int pot[MAXN]; ll maxi; int prost; ll solve(int x, int step) { // if (dp[x][pot[step]] != -1) return dp[x][pot[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; } t = (x + step) % n; } ll out = 0; if (flag) { ll steps_left = pot[n / step] + 1; //cout << x << " " << step << "..." << steps_left << " " << tr << endl << endl; 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); } } //cout << x << " " << step << " " << pot[step] << endl; //cout << flag << endl; //cout << out << " " << out2 << "\n\n"; return max(out, out2); } int bio[MAXN]; int sito() { for (int i = 2; i < MAXN; i++) { if (bio[i]) continue; if (n % i == 0) return i; for (int j = i + i; j < MAXN; j += i) bio[j] = 1; } return -1; } int main() { ios_base::sync_with_stdio(false); cin >> n; prost = sito(); int 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; }