#include #include using namespace std; const int MAXN = 100'001; const int MAXE = 20; string s[MAXE]; long long val[128]; vector dp[MAXE]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, p, e, k; cin>>n; if (n == 1) { p = 1; e = 0; } else { for (p = 2; p * p <= n && n % p; ++p); if (p * p > n) p = n; e = 1; for (int x = p; x != n; x *= p, ++e); } cin>>s[e]>>k; for (int i = 0; i < k; ++i) { char c; cin>>c; cin>>val[c]; val['?'] = max(val['?'], val[c]); } dp[e].resize(n); for (int i = 0; i < n; ++i) { dp[e][i] = val[s[e][i]]; } for (int i = e - 1, step = n / p, sz = p, prv = n; i >= 0; --i, prv = step, step /= p, sz *= p) { s[i].resize(step, '?'); dp[i].resize(step); for (int j = 0; j < step; ++j) { for (int k = j; k < prv; k += step) { if (s[i + 1][k] != '?') { if (s[i][j] == '?') s[i][j] = s[i + 1][k]; else if (s[i][j] != s[i + 1][k]) s[i][j] = '!'; } dp[i][j] += dp[i + 1][k]; } dp[i][j] = max(dp[i][j], val[s[i][j]] * (e - i + 1) * sz); } } cout<