#include using namespace std; using ll = long long; using vi = vector; using vll = vector; using pii = pair; using graph = vector; #define FOR(name__, upper__) for (int name__ = 0; name__ < (upper__); ++name__) #define all(x) begin(x), end(x) #define mp make_pair #define mt make_tuple template void initialize_matrix(vector>& matrix, int rows, int cols, T value) { assert(matrix.empty()); FOR (row, rows) matrix.emplace_back(cols, value); } void get_prime_power(ll n, ll &p, ll &x) { for (p = 2; p <= n; p++) { if (n % p == 0) break; } ll a = p; x = 1; while (a < n) a *= p, x++; } ll find_best(const string& s, const vector& cost, ll n, int index, ll jump_len, ll p, ll x) { if (x < 0) return 0; char change_letter = s[index]; for (int i = index; i < n; i += jump_len) { if (s[i] != change_letter) { if (s[i] == '?') continue; else if (change_letter == '?') change_letter = s[i]; else change_letter = 0; } } ll split_cost = 0; /* int i = index; FOR (_, p) { split_cost += find_best(s, cost, n, i, jump_len * p, p, x - 1); i += jump_len; } */ for (int i = index; i < index + p; i++) { split_cost += find_best(s, cost, n, i, jump_len * p, p, x - 1); } //std::cout << "index: " << index << ", jump_len = " << jump_len << ", x = " << x << ", change_letter = " << change_letter << std::endl; ll quantity = n / jump_len; // we can get anything if (change_letter == '?') { ll best_cost = *std::max_element(cost.begin(), cost.end()) * quantity * (x + 1); return best_cost; } // we can get anything selected else if (change_letter == 0) { return split_cost; } // one custom letter else { ll letter_cost = cost[change_letter - 'A'] * quantity * (x + 1); return std::max(letter_cost, split_cost); } } void go() { ll n; string s; cin >> n >> s; vector cost(30, 0); ll q; cin >> q; while (q--) { char a; ll c; cin >> a >> c; cost[a - 'A'] = c; } ll p, x; get_prime_power(n, p, x); cout << find_best(s, cost, n, 0, 1, p, x) << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); go(); return 0; }