#include #include #include using namespace std; long long N, p, n, k, val[27]; int main () { cin.tie(0); cout.tie(0); vector kat; cin >> N; for(int i = 2; i <= N; i++) { if(N % i == 0) { p = i; break; } } n = 0; long long xx = 1; while(xx < N) { n++; xx *= p; } int typ[N]; char cc; string ssss; vector znaki[n+2][29];// 28 to '?' for(int s = 0; s < 29; s++) { xx = N; for(int i = 0; i <= n; i ++) { znaki[i][s].resize(xx); xx /= p; } } int zap = '?' - 'A'; cin>>ssss; for(int i = 0; i < N; i++) { typ[i] = (int) ssss[i]; typ[i] -= 'A'; for(int s = 0; s < 29;s ++) { znaki[0][s][i] = 0; } if(typ[i] == zap) { znaki[0][28][i] = 1; } else { znaki[0][typ[i]][i] = 1; } } cin >> k; for(int i = 0; i < k; i++) { cin >> cc; cin >> val[cc - 'A']; kat.push_back(cc - 'A'); } long long maksi = 0; kat.push_back(28); for(int i = 0; i < k; i ++) { maksi = max(maksi, val[i]); } if(N == 1) { if(typ[0] == zap) { cout << maksi << '\n'; } else { cout << val[typ[0]] << '\n'; } return 0; } /// ZNAKI //// for(int s : kat) { xx = N/p; for(int i = 0; i < n; i ++) {// xx = p^(n-i-1) for(int x = 0; x < xx; x ++) { znaki[i + 1][s][x] = 0; for(int l = 0; l < p; l ++) { znaki[i + 1][s][x] += znaki[i][s][x + l * xx]; } } xx /= p; } } /////////////////////////////////////// vector DP[n+2]; xx = N; for(int i = 0; i <= n; i ++) { DP[i].resize(xx); xx /= p; } for(int x = 0; x < N; x ++) { if(typ[x] == zap) { DP[0][x] = maksi; } else { DP[0][x] = val[typ[x]]; } } xx = N/p; long long pi = p; for(int i = 0; i < n; i ++) {// xx = p^(n-i-1), pi = p ^ (i+1) for(int x = 0; x < xx; x ++) { DP[i + 1][x] = 0; for(int l = 0; l < p; l ++) { DP[i + 1][x] += DP[i][x + l * xx]; } if(znaki[i + 1][28][x] == pi) { DP[i + 1][x] = max(DP[i+1][x], (i+2) * pi * maksi); } else { int ilez = 0; int ktore; for(int s : kat) { if(znaki[i+1][s][x] > 0 && s < 28) { ilez ++; ktore = s; } } if(ilez == 1) { DP[i + 1][x] = max(DP[i+1][x], (i+2) * pi * val[ktore]); } } } xx /= p; pi *= p; } cout << DP[n][0] << '\n'; return 0; }