#include using namespace std; #define rep(i,a,n) for (int i=a;i=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define srtv(x) sort(all(x)) #define len(a) a.size() #define fi first #define se second #define lb lower_bound #define ub upper_bound typedef double db; typedef long long int ll; //#define int ll typedef vector vi; typedef vector vvi; typedef vector vvvi; typedef vector vvvvi; typedef queue qi; typedef pair pii; ll q = 100000000000; ll fast_power(ll a, ll k, ll &q) { if(k==0) return 1; return (k%2==0) ? fast_power((a*a),k/2,q) : (a*fast_power((a*a),(k-1)/2,q)); } int get_p(int n){ for (int i = 2; i <=n; i++){ if (n%i == 0) return i; } return 1; } // p^k = n int get_k(int n, int p){ int mpres = 1; for (int i = 1; ; i++){ mpres*=p; if (mpres == n){ return i; } } } int n, p, k; int pizzo[1024]; string houses; char best_cat; char get_forcing_color(int start, int step){ char fc = '?'; bool flag = true; for (int i = start; i != start || flag; i = (i + step) % n){ if (houses[i] != '?'){ fc = houses[i]; break; } flag = false; } //cout<<"Forcing color "< cats; bool flag = true; for (int i = start; i != start || flag; i = (i + step) % n){ if (houses[i] != '?'){ if (cats.size() > 0){ if (cats[0] != houses[i]){ //cout<<"selfcontra for start "< profic_bc){ color_path(start, step, fc); return fc; } else{ color_path(start, step, best_cat); return best_cat; } } } int main(){ cin>>n; cin>>houses; int cat_cnt; cin>> cat_cnt; for (int i = 0; i < cat_cnt; i++){ char cat; int cost; cin>>cat>>cost; pizzo[cat] = cost; } best_cat = 'A'; for (char c = 'A'; c < 'A' + cat_cnt; c++){ if (pizzo[c] > pizzo[best_cat]){ best_cat = c; } } int profit = 0; // TODO: corner case n = 1 if (n!=1){ p = get_p(n); k = get_k(n, p); rep(i,0,n){ if (houses[i] == '?'){ get_cat(i, n); } } // rep(i,0,n){ // cout<