#include #include #include using namespace std; long long N, p, n, k, val[27]; int main () { vector kat; cin >> N; for(int i = 2; i * 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; long long znaki[n+2][N][29];// 28 -'?' int zap = '?' - 'A'; cin>>ssss; for(int i = 0; i < N; i++) { typ[i] = (int) ssss[i]; typ[i] -= 'A'; if(typ[i] == zap) { znaki[0][i][28] = 1; for(int s =0; s < 28;s ++) { znaki[0][i][s] = 0; } } else { znaki[0][i][typ[i]] = 1; for(int s =0; s != typ[i] && s <29; s ++) { znaki[0][i][s] = 0; } } } 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][x][s] = 0; for(int l = 0; l < p; l ++) { znaki[i + 1][x][s] += znaki[i][x + l * xx][s]; } } xx /= p; } } /////////////////////////////////////// long long DP[n+2][N]; 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][x][28] == 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][x][s] > 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; }