//vsp #include #define cat(x) cerr << #x << " = " << x << "\n"; #define rep(i, a, b) for (int i = (a); i < (b); i++) #define per(i, a, b) for (int i = (b) - 1; (a) <= i; i--) #define FOR(i, n) for (int i = 0; i < (n); i++) #define sz(x) int(x.size()) #define pb push_back using ll = long long; using namespace std; const int N = 2e5; int n, k, expo, prime, t[N], maks, cnt[26], cost[26]; string s; ll solve(vector v, int q = 0) { if (sz(v) == 1) { if (t[v[0]] == -1) return maks; else return cost[v[0]]; } memset(cnt, 0, sizeof cnt); int c = 0; for (auto x : v) { if (t[x] != -1) { c++; cnt[t[x]]++; } } ll res = 0; rep(i, 0, 26) if (c == cnt[i]) { res = max(res, 1ll * cost[i] * sz(v) * (expo - q + 1)); } ll res2 = 0; FOR(r, prime) { vector new_v; for (int i = r; i < sz(v); i += prime) new_v.pb(v[i]); res2 += solve(new_v, q + 1); } return max(res, res2); } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> s >> k; FOR(i, n) { if (s[i] == '?') t[i] = -1; else t[i] = s[i] - 'A'; } FOR(i, k) { char c; cin >> c; int id = c - 'A'; cin >> cost[id]; maks = max(maks, cost[id]); } if (n == 1) { cout << solve({0}, 0) << '\n'; return 0; } rep(i, 2, n + 1) if (n % i == 0) { prime = i; break; } vector v(n); iota(v.begin(), v.end(), 0); int m = n; while (m % prime == 0) { m /= prime; expo++; } cout << solve(v, 0) << '\n'; return 0; }