BestCoder 2015百度之星资格赛1003 IP聚合 -
发布时间:2020-12-13 22:27:09 所属栏目:百科 来源:网络整理
导读:Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址。网络地址等于子网掩码与 IP 地址按位进行与运算后的结果,例如: 子
计算后排序处理一下;
#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,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("%dn",n - c); } } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |