#include #include #include using namespace std; using namespace __gnu_pbds; #define ll long long #define lll __int128 #define ull unsigned long long #define fi first #define se second #define db double #define ld long double #define lld __float128 /// order_of_key, find_by_order template using custom_set = tree; template using ordered_set = tree, rb_tree_tag, tree_order_statistics_node_update>; template using ordered_multiset = tree, rb_tree_tag, tree_order_statistics_node_update>; template using ordered_map = tree, rb_tree_tag, tree_order_statistics_node_update>; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); mt19937_64 rnd_64(chrono::steady_clock::now().time_since_epoch().count()); ll cst[27], mx; vector ctg; ll dvd, pw, n; string s; ll rec(int vl, int i, int cr) { bool good = 1; char c = '#'; for(int j = i; j < n; j += vl) { if(s[j] != '?') { if(c == '#') c = s[j]; else if(c != s[j]) { good = 0; break; } } } if(!good) { ll sum = 0; for(int j = 0; j < dvd; j++) { sum += rec(vl*dvd, i+j*vl, cr+1); } return sum; } if(c == '#') { return (pw-cr+1) * mx*n/vl; } if(cr == pw) { return cst[c-'A']; } ll sum = 0; for(int j = 0; j < dvd; j++) { sum += rec(vl*dvd, i+j*vl, cr+1); } return max((pw-cr+1) * cst[c-'A']*n/vl, sum); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i = 2; i <= n; i++) { if(n % i == 0) { dvd = i; break; } } int N = n; while(N > 1) { pw++; N /= dvd; } cin >> s; int k; cin >> k; for(int i = 0; i < k; i++) { char c; cin >> c; ctg.push_back(c); cin >> cst[c-'A']; mx = max(mx, cst[c-'A']); } cout << rec(1, 0, 0); } /// shche ne vmerla Ykraina