计算后排序处理一下;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
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;
}