int gd[200]; char gdl[200]; char str[120000]; char query[120000]; int n;
int main() { int pos = -1; scanf("%s",gdl); for (int i = 0 ; gdl[i] ; i ++) gd[gdl[i]]=1; scanf("%s",str); int len = strlen(str); for (int i = 0 ; i< len ; i ++) if (str[i]=='*') { pos = i; break; } scanf("%d",&n); for (int i = 1; i <= n ; i ++) { scanf("%s",query); int lq = strlen(query); int cnt = 0,f=1,fal = len-1; if (pos==-1) { if (lq!=len) { printf("NO\n"); continue; } for (int j = 0 ; j < lq ; j ++) { if (str[cnt]=='?') { if (gd[query[j]]==0) { f= 0 ; break; } else cnt++; } else { if (query[j]!=str[cnt]) { f = 0; break; } else cnt++; } } } else { if (lq<len-1) { printf("NO\n"); continue; } for (int j = 0 ; j < pos ; j ++) { if (str[cnt]=='?') { if (gd[query[j]]==0) { f=0; break; } else cnt++; } else { if (query[j]!=str[cnt]) { f= 0 ; break; } else cnt++; } }
int s = lq -1; for (int j = len-1; j >= pos +1 ; j --) { if (str[j]=='?') { if (gd[query[s]]==0) { f = 0; break; } else s --; } else { if (str[j]!=query[s]) { f = 0; break;
} else s--; } } for (int j = pos ; j <= s ;j ++) { if (gd[query[j]]) { f= 0; break; } } }