#include #include #include #include #define S 100007 using namespace std; typedef long long ll; int K[100]; char T[S]; int p; int n; //pozycja poczatkowa x, skoki co l ll f(int x, int l){ if(l > n) return 0; bool blad = false; int co = 0; for(int i = x; i <= n;i+=l){ if(T[i] == '?') continue; if(co){ if(T[i]-'A'+1 == co){ }else{ blad = true; } }else{ co = T[i]-'A'+1; } } if(blad){ ll pom = 0; for(int i = 1; i <= p;i++){ pom += f(x + (i-1) * l,l*p); } return pom; }else{ if(co == 0){ //nic nie ma, wybieramy najbardziej oplacalny int m = 0; for(int i = 1; i <= 26;i++){ m = max(m,K[i]); } ll ileRazy = 1; int n2 = n; while(n2 != l){ n2 /= p; ileRazy++; } ileRazy *= (ll)n; ileRazy /= (ll)l; return (ll)ileRazy * (ll)m; }else{ //zapelniamy tym co jest lub rozbijamy ll pom = 0; for(int i = 1; i <= p;i++){ pom += f(x + (i-1) * l,l*p); } int m = K[co]; ll ileRazy = 1; int n2 = n; while(n2 != l){ n2 /= p; ileRazy++; } ileRazy *= (ll)n; ileRazy /= (ll)l; pom = max(pom, (ll)m * ileRazy); return pom; } } } int main(void){ scanf("%d",&n); for(int i = 1; i <= n;i++){ scanf(" %c",&T[i]); } int k; scanf("%d",&k); char c; int x; for(int i = 1; i <= k;i++){ scanf(" %c %d",&c,&x); K[c-'A'+1] = x; } for(int i = 2; i <= n;i++){ if(n % i == 0){ p = i; break; } } printf("%lld",f(1,1)); return 0; }