#define _USE_MATH_DEFINES #include #ifdef LOC #include "debuglib.h" #else #define deb(...) #define DBP(...) #endif using namespace std; using ll = long long; using Vi = vector; using Pii = pair; #define pb push_back #define mp make_pair #define x first #define y second #define rep(i, b, e) for (int i = (b); i < (e); i++) #define each(a, x) for (auto& a : (x)) #define all(x) (x).begin(), (x).end() #define sz(x) int((x).size()) int uplg(int n) { return 32-__builtin_clz(n); } int uplg(ll n) { return 64-__builtin_clzll(n); } ll money[26]; int p; ll solve(const string& s) { int n = sz(s); int cnt[26] = {}; each(c, s) if (c != '?') cnt[c-'A']++; int diff = 0; each(c, cnt) diff += c > 0; int depth = 1; for (int x = n; x > 1; x /= p) depth++; deb(s, diff); if (diff == 0) { return *max_element(money, money+26) * n * depth; } ll ans = 0; if (n > 1) { rep(i, 0, p) { string t; for (int j = i; j < n; j += p) t.pb(s[j]); ans += solve(t); } } if (diff == 1) { int j = 0; rep(i, 0, 26) if (cnt[i] > 0) j = i; ans = max(ans, money[j] * n * depth); } return ans; } int main() { cin.sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(18); int n; cin >> n; string s; cin >> s; int k; cin >> k; rep(i, 0, k) { string t; int m; cin >> t >> m; money[t[0]-'A'] = m; } for (p = 2; n%p != 0; p++); cout << solve(s) << '\n'; return 0; }