#include #include #include using namespace std; struct adat { char ekat; int kmax = 0; }; int main() { ios::sync_with_stdio(false); int N; string s; int kszam; cin >> N >> s >> kszam; int pizzo[26]; int mkatv = -1; for (int i = 0; i < kszam; i++) { char c; int v; cin >> c >> v; pizzo[c - 'A'] = v; if (v > mkatv) mkatv = v; } vector a(N); for (int i = 0; i < N; i++) { a[i].ekat = s[i]; if (s[i] == '?') { a[i].kmax = mkatv; } else { a[i].kmax = pizzo[s[i] - 'A']; } } if (N == 1) { cout << a[0].kmax << "\n"; return 0; } int p = 2; while (N % p != 0) p++; int szint = 1; while (a.size() > 1) { szint++; vector ea(a.size() / p); swap(a, ea); for (size_t i = 0; i < a.size(); i++) { adat& A = a[i]; A.ekat = '?'; int u = 0; for (int j = 0; j < p; j++) { adat eA = ea[i + j * a.size()]; A.kmax += eA.kmax; if(A.ekat == '?') A.ekat = eA.ekat; else if (eA.ekat == '.' || eA.ekat != '?' && eA.ekat != A.ekat) A.ekat = '.'; } if (A.ekat != '.') { A.kmax = max(A.kmax, N / (int)a.size() * szint * (A.ekat != '?' ? pizzo[A.ekat - 'A'] : mkatv)); } } } cout << a[0].kmax << "\n"; }