#include #include #include #include #include using namespace std; const int N = 100005; struct node{ int a1, a2, a3, a4; }ip[N], sn[N], res[N]; bool cmp(node a, node b){//用于排序后决定由多少个网络地址 if(a.a1 != b.a1) return a.a1 <= b.a1; if(a.a2 != b.a2) return a.a2 <= b.a2; if(a.a3 != b.a3) return a.a3 <= b.a3; if(a.a4 != b.a4) return a.a4 <= b.a4; } int main(){ int t, tot = 1, m, n; scanf("%d", &t); while(t--){ memset(res, 0, sizeof(res)); scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d.%d.%d.%d", &ip[i].a1, &ip[i].a2, &ip[i].a3, &ip[i].a4); for(int i = 1; i <= m; i++) scanf("%d.%d.%d.%d", &sn[i].a1, &sn[i].a2, &sn[i].a3, &sn[i].a4); int k = 0; printf("Case #%d:\n", tot++); for(int i = 1; i <= m; i++){ int c = 0, cnt = 0; for(int j = 1; j <= n; j++){ res[k].a1 = ip[j].a1 & sn[i].a1; res[k].a2 = ip[j].a2 & sn[i].a2; res[k].a3 = ip[j].a3 & sn[i].a3; res[k].a4 = ip[j].a4 & sn[i].a4; k++; } sort(res + k - n, res + k, cmp); for(int j = k - n; j < k; j++){ if((res[j].a1 == res[j + 1].a1) && (res[j].a2 == res[j + 1].a2) && (res[j].a3 == res[j + 1].a3) && (res[j].a4 == res[j + 1].a4)) c++; } printf("%d\n", n - c); } } return 0; }