import java.util.*; public class waterloo06e { static Scanner in = new Scanner(System.in); HashSet hs = new HashSet(); ArrayList al = new ArrayList(); public class Tile implements Comparable { char letter; int value; // public int compareTo(Tile t1) { // return t1.value - this.value; // } public int compareTo(Tile t1) { return this.letter - t1.letter; } } public String orderedStr(String s) { char[] a = s.toCharArray(); Arrays.sort(a); return new String(a); } public String orderedStr(Tile[] t, int s, int f) { char[] a = new char[f-s+1]; int cnt = 0; for(int i = s; i <= f; i++) { a[cnt] = t[i].letter; cnt++; } Arrays.sort(a); return new String(a); } public void solve() { int n = in.nextInt(); in.nextLine(); for(int i=0; i < n; i++) { String s = orderedStr(in.nextLine()); hs.add(s); al.add(s); } int m = in.nextInt(); for(int i = 0; i < m; i++ ) { int x = in.nextInt(); in.nextLine(); Tile[] hand = new Tile[x]; for(int j = 0; j < x; j++) { String[] s = in.nextLine().split(" "); hand[j] = new Tile(); hand[j].letter = s[0].charAt(0); hand[j].value = Integer.parseInt(s[1]); } Arrays.sort(hand); done = new HashSet(); int score = getMaxScore(hand, 0); System.out.println(score); } } //MISSES LOTS OF CASES, to do this right need a more dynamic greedy solution public int getMaxScore(Tile[] hand) { for(int i = 0; i < hand.length; i++) { for(int j = hand.length - 1; j >= i; j--) { String s = orderedStr(hand, i, j); System.out.println(s); if(hs.contains(s)) return score(hand, i, j); } } return 0; } HashSet done = new HashSet(); public int getMaxScore(Tile[] hand, int i) { done.add(i); int finVal = (int)Math.pow(2, hand.length)-1; if(hs.contains(getString(hand, i))) return score(hand, i); if(i == finVal) return 0; int max = 0; for(int j = 0; j < hand.length; j++ ) { if( (i | (1 << j)) == i) continue; if(done.contains(i | (1 << j))) continue; int m = getMaxScore(hand, (i | (1 << j))); if(m > max) max = m; } return max; } private String getString(Tile[] hand, int mask) { String val = ""; for(int i = 0; i < hand.length; i++) { if( (mask | (1 << i)) != mask) val += hand[i].letter; } return val; } private int score(Tile[] hand, int mask) { int val = 0; for(int i = 0; i < hand.length; i++) { if( (mask | (1 << i)) != mask) val += hand[i].value; } return val; } private int score(Tile[] hand, int s, int f) { int val = 0; for(int i = s; i <= f; i++) { val += hand[i].value; } return val; } public static void main(String[] args) { waterloo06e r = new waterloo06e(); r.solve(); } }