/*#pragma GCC target ("avx2") #pragma GCC optimize ("O3") #pragma GCC optimize ("unroll-loops")*/ #include #define bit(n, i) (((n)>>(i))&1) #define cat(x) cout << #x << " = " << x << "\n" #define pb push_back #define mp make_pair #define se second #define fi first #define inf 2000000000 #define llinf 2000000000000000000LL #define forn(i, a, b) for(ll i = (a); i <= (b); ++i) #define all(x) (x).begin(), (x).end() #define ppc(x) __builtin_popcount(x) using namespace std; typedef long long ll; typedef double ld; typedef pair i2; typedef vector vi; typedef vector vll; /*const ll mod = 167772161; inline ll add(ll a, ll b) { a += b; if(a >= mod) a -= mod; return a; } inline ll sub(ll a, ll b) { return add(a, mod-b); } inline ll mul(ll a, ll b) { return a*b%mod; }*/ const int N = 1e5+9; int A[N]; int letter[17][N]; ll dp[17][N], sum[17][N]; ll cost[26]; int n, p, lg, mxcost; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; int m = n; int p = 2; while(n % p != 0) p++; while(n != 1) { lg++; n /= p; } n = m; forn(i, 0, n-1) { char c; cin >> c; if(c == '?') A[i] = -1; else A[i] = c-'A'; } int k; cin >> k; forn(i, 0, k-1) { char c; int v; cin >> c >> v; cost[c-'A'] = v; mxcost = max(mxcost, v); } forn(i, 0, n-1) { letter[lg][i] = A[i]; dp[lg][i] = A[i] == -1 ? mxcost : cost[A[i]]; sum[lg][i] = 1; } for(int i = lg-1; i >= 0; --i) { m /= p; for(int j = 0; j < m; ++j) { int paint = -1; sum[i][j] = n/m; for(int l = j; l < m*p; l += m) { dp[i][j] += dp[i+1][l]; sum[i][j] += sum[i+1][l]; if(letter[i+1][l] == -2) { paint = -2; } else if(letter[i+1][l] != -1) { if(paint == -1) { paint = letter[i+1][l]; } else if(paint != letter[i+1][l]) { paint = -2; } } } if(paint == -1) { dp[i][j] = max(dp[i][j], sum[i][j]*mxcost); } else if(paint != -2) { dp[i][j] = max(dp[i][j], sum[i][j]*cost[paint]); } letter[i][j] = paint; } } cout << dp[0][0]; return 0; }