/* 15:39 - 16:08 */ #include #include typedef struct { int is_permitted; char src[9], dst[9]; } rule_t; int match_with_wildcards(char *s, char *sw) { int i; for (i = 0; ; i++) { if (s[i] == '\0' && sw[i] == '\0') { return 1; } if (s[i] == '\0' || sw[i] == '\0') { return 0; } if (s[i] == sw[i] || sw[i] == '?') { continue; } return 0; } } int main() { char s[1024]; int n, m, i, j; rule_t rules[1025]; char result[1025][80]; int n_result; while (1) { gets(s); sscanf(s, "%d %d", &n, &m); if (n == 0 && m == 0) { break; } for (i = 0; i < n; i++) { char *p; gets(s); p = strtok(s, " "); if (strcmp(p, "permit") == 0) { rules[i].is_permitted = 1; } else { rules[i].is_permitted = 0; } p = strtok(NULL, " "); strcpy(rules[i].src, p); p = strtok(NULL, " "); strcpy(rules[i].dst, p); } n_result = 0; for (i = 0; i < m; i++) { char *p, t[80], src[9], dst[9]; gets(s); strcpy(t, s); p = strtok(s , " "); strcpy(src, p); p = strtok(NULL, " "); strcpy(dst, p); for (j = n-1; j >= 0; j--) { int result_src, result_dst; result_src = match_with_wildcards(src, rules[j].src); result_dst = match_with_wildcards(dst, rules[j].dst); if (result_src && result_dst) { if (rules[j].is_permitted) { strcpy(result[n_result], t); n_result++; } else { break; } } } } printf("%d\n", n_result); for (i = 0; i < n_result; i++) { printf("%s\n", result[i]); } } return 0; }