#include #include #include using namespace std; int p, n; bool translated(int i,int j) { int q = p; while (q <= n) { if (i % q != j % q) return i % q < j % q; q = q * p; } return false; } int translation[100100]; long long letter[200200][26]; long long best[200200]; long long any[200200]; char letterToCat[256]; long long value[26]; int main() { ios_base::sync_with_stdio(0); cin >> n; p = 2; while (n % p != 0 && p < n ) p ++; for (int i = 0; i < n; i ++) translation[i] = i; sort(translation, translation + n, translated); string in; cin >> in; int letters; cin >> letters; char a; long long b; for (int i = 0; i < letters; i ++) { cin >> a >> b; letterToCat[a] = i; value[i] = b; } for (int i = 0; i < n; i ++) { int akt = (n - 1) / (p - 1) + translation[i]; if (in[i] == '?') { any[akt] = 0; best[akt] = 0; for (int j = 0; j < letters; j ++) { letter[akt][j] = value[j]; best[akt] = max(value[j], best[akt]); } } else { any[akt] = 0; best[akt] = value[letterToCat[in[i]]]; letter[akt][letterToCat[in[i]]] = value[letterToCat[in[i]]]; } } int np = n; long long range = 1; while (1) { if (np == 1) break; np = np / p; range = range * p; int this_start = (np - 1) / (p - 1); int next_start = this_start + np; for (int x = 0; x < np; x ++) { int akt = this_start + x; long long akt_best = 0; for (int chosen = 0; chosen < letters; chosen ++) { long long pom = 0; bool ok = true; for (int i = 0; i < p; i ++) { if (letter[next_start + x * p + i][chosen] == 0){ ok = false; break; } pom += letter[next_start + x * p + i][chosen]; } if (!ok) continue; pom += range * value[chosen]; letter[akt][chosen] = pom; if (pom > akt_best) akt_best = pom; } for (int i = 0; i < p; i ++) any[akt] += best[next_start + x * p + i]; if (any[akt] > akt_best) akt_best = any[akt]; best[akt] = akt_best; } } cout << best[0]; }