#include using namespace std; #define ALL(x) (x).begin(), (x).end() template void mini(C &a5, C b5) { a5 = min(a5, b5); } template void maxi(C &a5, C b5) { a5 = max(a5, b5); } #ifdef LOCAL const bool debug = true; #else const bool debug = false; #define cerr if (true) {} else cout #endif #define int long long #define double long double const int INF = 1e18; const int mod = 1e9 + 7; string substr(const string &s, int pocz, int step) { string res; for (int i = pocz; i < (int)s.size(); i += step) { res.push_back(s[i]); } return res; } int cost[1010]; int solve(const string &s, int p, int k) { cerr << s << " " << p << " " << k << endl; char lit = '?'; bool good = true; for (char c : s) { if (c != '?') { if (lit == '?') { lit = c; } else if (lit != c) { good = false; } } } int res = 0; if ((int)s.size() > 1) { for (int i = 0; i < p; i++) { res += solve(substr(s, i, p), p, k - 1); } } if (good) { maxi(res, (int)s.size() * cost[(int)lit] * (k + 1)); } return res; } int pot(int n, int k) { int res = 1; while (k--) { res *= n; } return res; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; string s; cin >> s; int k; cin >> k; int ma = 0; for (int i = 0; i < k; i++) { char c; int a; cin >> c >> a; cost[(int)c] = a; maxi(ma, a); } cost[(int)'?'] = ma; int p = 2; while (n % p) p++; k = 1; while (pot(p, k) < n) k++; cerr << "p k " << p << " " << k << endl; cout << solve(s, p, k) << "\n"; return 0; }/* 4 A?A? 2 A 10 B 25 4 A??A 2 A 10 B 25 4 A?B? 2 A 10 B 25 */