Don't fall into the trap of n being 100000, there are too many of them.
Use its feature of having only 10 characters to do all the permutations and combinations.
There are at most 1024, and use sorting to refer to whether the dictionary has this word or not.
The speed will be much faster.
//====================================================================||
// ||
// ||
// Author : GCA ||
// 6AE7EE02212D47DAD26C32C0FE829006 ||
//====================================================================||
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string\>
#include <climits>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <cctype>
#include <utility>
using namespace std;
#ifdef ONLINE\_JUDGE
#define ll "%lld"
#else
#define ll "%I64d"
#endif
typedef unsigned int uint;
typedef long long int Int;
#define Set(a,s) memset(a,s,sizeof(a))
#define Write(w) freopen(w,"w",stdout)
#define Read(r) freopen(r,"r",stdin)
#define Pln() printf("\\n")
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()
#define De(x)printf(#x"%d\\n",x)
#define For(i,x)for(int i=0;i<x;i++)
#define CON(x,y) x##y
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\
printf("%d ",dp\[htx\]\[hty\]);}Pln();}
#define M 55
#define PII pair<int,int\>
#define PB push\_back
#define oo INT\_MAX
#define Set\_oo 0x3f
#define Is\_debug true
#define debug(...) if(Is\_debug)printf("DEBUG: "),printf(\_\_VA\_ARGS\_\_)
#define FOR(it,c) for(\_\_typeof((c).begin()) it=(c).begin();it!=(c).end();it++)
#define eps 1e-6
bool xdy(double x,double y){return x>y+eps;}
bool xddy(double x,double y){return x>y-eps;}
bool xcy(double x,double y){return x<y-eps;}
bool xcdy(double x,double y){return x<y+eps;}
int min3(int x,int y,int z){
int tmp=min(x,y);
return min(tmp,z);
}
int max3(int x,int y,int z){
int tmp=max(x,y);
return max(tmp,z);
}
int n,m,p;
set<string\> sw;
int wtile\[20\];
char ctile\[20\];
bool cmp(char a,char b){
return a<b;
}
int main() {
ios\_base::sync\_with\_stdio(0);
while(~scanf("%d",&n)){
for(int i=0;i<n;i++){
char str\[1000\];
scanf("%s",str);
int len=strlen(str);
sort(str,str+len,cmp);
sw.insert(str);
}
int nc;
scanf("%d",&nc);
while(nc--){
scanf("%d%\*c",&p);
for(int i=0;i<p;i++){
scanf("%c%d%\*c",&ctile\[i\],&wtile\[i\]);
}
int ans=0;
for(int i=0;i<(1<<p);i++){
string str;
int t=0;
for(int j=0;j<p;j++){
if((i>>j)&1){
str.PB(ctile\[j\]);
t+=wtile\[j\];
}
}
sort(str.begin(),str.end());
if(sw.count(str)){
ans=max(ans,t);
}
}
printf("%d\\n",ans);
}
}
}