//Michał Kępa, uwr3 #define _USE_MATH_DEFINES //#pragma GCC optimize("O3") // #pragma GCC target("sse4") #include using namespace std; #define LSB(i) ((i) & -(i)) // zeroes all the bits except the least significant one #define OPEN(a) freopen(a, "r", stdin) #define F first #define S second #define PB push_back #define BOOST ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define ALL(i) begin((i)), end((i)) #define SZ(i) ((int)i.size()) #define SORT(a) sort(ALL(a)) using LL = long long; using LD = long double;//__float128; using PII = pair; using PLL = pair; using PLD = pair; using VI = vector; using VLL = vector; using VLD = vector; using VPII = vector; using VPLL = vector; using VPLD = vector; using VVI = vector; #define GET_MACRO(_1, _2, _3, _4, NAME, ...) NAME #define __FOR3(i, a, n, inc) for(int i = (a); (inc) > 0 ? i < (n) : i >= (n); i += (inc)) #define __FOR2(i, a, n) __FOR3(i, a, n, 1) #define __FOR1(i, n) __FOR2(i, 0, n) #define FOR(...) GET_MACRO(__VA_ARGS__, __FOR3, __FOR2, __FOR1)(__VA_ARGS__) #define REV(a,b) for(int a= b; a >= 0; --a) #define FRU(a,b) for(const auto& a: b) #define FRUM(a,b) for(auto& a : b) const int inf = 1e9 + 7; const int MOD = inf;//998244353; const LL INF = 1e18 + 7; const long double PI = acos(-1); const LD EPS = 1e-9; namespace input { template< class T> istream& operator>>(istream& st, vector & container) { for (auto& u : container) st >> u; return st; } template< class T, size_t N> istream& operator>>(istream& st, array & container) { for (auto& u : container) st >> u; return st; } template istream& operator>>(istream& st, pair & p) { st >> p.first >> p.second; return st; } void re() {} template void re(T& x, TArgs&... rest) { cin >> x; re(rest...); } } using namespace input; namespace output { template< class T> ostream& operator<<(ostream& st, const vector & container) { for (auto& u : container) st << u << ' '; return st; } template< class T, size_t N> ostream& operator<<(ostream& st, const array & container) { for (auto& u : container) st << u << ' '; return st; } template ostream& operator<<(ostream& st, pair p) { st << p.first << ' ' << p.second; return st; } void pr() {} template void pr(const T& x) { cout << x; } template void pr(const T& x, const TArgs&... rest) { cout << x << ' '; pr(rest...); } template void prln(const TArgs&... args) { pr(args...); cout << '\n'; } } using namespace output; namespace pairs { template pair operator* (pairp, V val) { return{ p.first * val, p.second * val }; } template pair operator/ (pairp, V val) { return{ p.first / val, p.second / val }; } template pair operator- (pair a, pair b) { return{ a.first - b.first, a.second - b.second }; } template pair operator+ (pair a, pair b) { return{ a.first + b.first, a.second + b.second }; } } using namespace pairs; namespace triples { #define TT1T2T3 template #define TT1T2T3T4 template #define TRT1T2T3 triple TT1T2T3 struct triple { T1 x; T2 y; T3 z; triple() : x(T1()), y(T2()), z(T3()) {}; triple(T1 _x, T2 _y, T3 _z) :x(_x), y(_y), z(_z) {} }; TT1T2T3 bool operator<(const TRT1T2T3&t1, const TRT1T2T3&t2) { if (t1.x != t2.x)return t1.x < t2.x; if (t1.y != t2.y) return t1.y < t2.y; else return t1.z < t2.z; } TT1T2T3 bool operator>(const TRT1T2T3&t1, const TRT1T2T3&t2) { if (t1.x != t2.x)return t1.x > t2.x; if (t1.y != t2.y) return t1.y > t2.y; else return t1.z > t2.z; } TT1T2T3 bool operator==(const TRT1T2T3&t1, const TRT1T2T3&t2) { return (t1.x == t2.x && t1.y == t2.y && t1.z == t2.z); } TT1T2T3 inline istream& operator >> (istream& os, triple& t) { return os >> t.x >> t.y >> t.y; } TT1T2T3 ostream& operator << (ostream& os, const triple& t) { return os << t.x << " " << t.y << " " << t.z; } TT1T2T3 TRT1T2T3 operator+(TRT1T2T3 a, TRT1T2T3 b) { return { a.x + b.x, a.y + b.y, a.z + b.z }; } TT1T2T3 TRT1T2T3 operator-(TRT1T2T3 a, TRT1T2T3 b) { return { a.x - b.x, a.y - b.y, a.z - b.z }; } TT1T2T3T4 TRT1T2T3 operator*(TRT1T2T3 a, T4 val) { return { a.x * val, a.y * val, a.z * val }; } TT1T2T3T4 TRT1T2T3 operator/(TRT1T2T3 a, T4 val) { return { a.x / val, a.y / val, a.z / val }; } #undef TT1T2T3T4 #undef TRT1T2T3 #undef TT1T2T3 using TRII = triple; using TRLL = triple; using TRLD = triple; using VTRII = vector; using VTRLL = vector; using VTRLD = vector; } using namespace triples; namespace geo { template T dotProduct(pair a, pair b) { return a.first*b.first + a.second* b.second; } template T crossProduct(paira, pair b) { return a.first * b.second - a.second * b.first; } template T lengthPow(pair a) { return a.first*1ll*a.first + a.second*1ll*a.second; } template LD length(pair a) { return sqrt(lengthPow(a)); } template T dotProduct(triple a, triple b) { return a.x*b.x + a.y* b.y + a.z*b.z; } template T crossProduct(triple a, triple b) { return { a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x }; } template T lengthPow(triple a) { return a.x*1ll*a.x + a.y*1ll*a.y + a.z*1ll*a.z; } template LD length(triple a) { return sqrt(lengthPow(a)); } } using namespace geo; template T invGeneral(T a, T b) { // 0 < a < b, gcd(a,b) = 1 a %= b; if (a == 0) return b == 1 ? 0 : -1; T x = invGeneral(b, a); return x == -1 ? -1 : ((1 - (LL)b * x) / a + b) % b; } template struct modular { T val; explicit operator T() const { return val; } modular() { val = 0; } modular(const LL& v) { val = (-MOD <= v && v <= MOD) ? v : v % MOD; if (val < 0) val += MOD; } friend ostream& operator<<(ostream& os, const modular& a) { return os << a.val; } friend void pr(const modular& a) { pr(a.val); } friend void re(modular& a) { LL x; re(x); a = modular(x); } friend bool operator==(const modular& a, const modular& b) { return a.val == b.val; } friend bool operator!=(const modular& a, const modular& b) { return !(a == b); } friend bool operator<(const modular& a, const modular& b) { return a.val < b.val; } modular operator-() const { return modular(-val); } modular& operator+=(const modular& m) { if ((val += m.val) >= MOD) val -= MOD; return *this; } modular& operator-=(const modular& m) { if ((val -= m.val) < 0) val += MOD; return *this; } modular& operator*=(const modular& m) { val = (LL)val*m.val%MOD; return *this; } friend modular pow(modular a, LL p) { modular ans = 1; for (; p; p /= 2, a *= a) if (p & 1) ans *= a; return ans; } friend modular inv(const modular& a) { auto i = invGeneral(a.val, MOD); assert(i != -1); return i; } // equivalent to return exp(b,MOD-2) if MOD is prime modular& operator/=(const modular& m) { return (*this) *= inv(m); } friend modular operator+(modular a, const modular& b) { return a += b; } friend modular operator-(modular a, const modular& b) { return a -= b; } friend modular operator*(modular a, const modular& b) { return a *= b; } friend modular operator/(modular a, const modular& b) { return a /= b; } }; using MI = modular; using PMI = pair; using VMI = vector; using VPMI = vector; namespace debug { template < typename _T > inline void _debug(const char *s, _T x) { cerr << s << " = " << x << "\n"; } template < typename _T, typename... args > void _debug(const char *s, _T x, args... a) { while (*s != ',') cerr << *s++; cerr << " = " << x << ','; _debug(s + 1, a...); } #if 1 && defined(LOCAL) #define debug(...) _debug(#__VA_ARGS__, __VA_ARGS__) #else #define debug(...) 1999 #define cerr if(0) cout #endif } using namespace debug; template bool setMax(T& v, T newV) { if (v < newV) { v = newV; return true; } return false; } template bool setMin(T& v, T newV) { if (v > newV) { v = newV; return true; } return false; } LL cost[30]; LL check(const string & s, int d, int mno) { vector lets(d); FOR(i, s.size()) { if(s[i] == '?') continue; int myLet = s[i] - 'A' + 1; if(lets[i % d] != 0 and lets[i % d] != myLet) return 0; lets[i % d] = myLet; } LL res = 0; for(int i = 0; i < d; ++i) { res += (s.size() / d) * cost[lets[i]] * mno; } return res; } void solve() { int n; cin >> n; int prime = 2; int pot = 0; if(n == 1) { prime = 1; pot = 1; } else { while(n % prime != 0) prime++; while(n > 1) { assert(n % prime == 0); n /= prime; pot += 1; } } string s; cin >> s; int m; cin >> m; int maxi = 0; FOR(i, m) { string let; int c; cin >> let >> c; cost[let[0] - 'A' + 1] = c; setMax(maxi, c); } cost[0] = maxi; int curPrime = 1; LL res = 0; FOR(i, pot + 1) { setMax(res, check(s, curPrime, pot + 1 - i)); curPrime *= prime; } prln(res); } int main() { // #ifndef LOCAL // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); // #endif BOOST; cout << fixed << setprecision(13); int t = 1; // cerr << "testy!!!!\n"; cin >> t; for(int i = 1; i <= t; ++i) // string s; // while(cin >> s) { // cout << "Case #" << i << ": "; solve(); } return 0; }