IP聚合
Accepts: 1901
Submissions: 4979
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
/** 题意:给n个ip地址,m个子网掩码,求在每一个子网掩码下的网络地址有多少个 做法:结构体 **/ #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <cmath> #define maxn 1100 using namespace std; struct Node { int a; int b; int c; int d; Node(){} } node[maxn],ip[maxn]; Node mm[maxn]; int cmp(Node A,Node B) { if(A.a != B.a) return A.a < B.a; else if(A.b != B.b) return A.b < B.b; else if(A.c != B.c) return A.c < B.c; else return A.d < B.d; } int check(Node A,Node B) { if(A.a == B.a && A.b == B.b && A.c == B.c && A.d == B.d) return 1; return 0; } int main() { //freopen("in.txt","r",stdin); int Case = 1; int T; scanf("%d",&T); while(T--) { int n,m; memset(mm,0,sizeof(mm)); memset(node,0,sizeof(node)); memset(ip,0,sizeof(ip)); scanf("%d %d",&n,&m); for(int i=0; i<n; i++) { scanf("%d.%d.%d.%d",&ip[i].a,&ip[i].b,&ip[i].c,&ip[i].d); } for(int i=0; i<m; i++) { scanf("%d.%d.%d.%d",&node[i].a,&node[i].b,&node[i].c,&node[i].d); } printf("Case #%d: ",Case++); for(int i=0; i<m; i++) { string str[maxn]; string ch; int cnt = 0; for(int j=0; j<n; j++) { mm[j].a = (node[i].a&ip[j].a); mm[j].b = (node[i].b&ip[j].b); mm[j].c = (node[i].c&ip[j].c); mm[j].d = (node[i].d&ip[j].d); } sort(mm,mm+n,cmp); Node tmp; tmp = mm[0]; //cout<<tmp.a <<" "<<tmp.b <<" "<<tmp.c <<" "<<tmp.d<<endl; int res = 1; for(int j=1;j<n;j++) { if(!check(tmp,mm[j])) { res ++; tmp = mm[j]; } } printf("%d ",res); } } return 0; }