IP聚合
Accepts: 141
Submissions: 298
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
Input
第一行包含一个整数TT,(1 \leq T \leq 50)(1≤T≤50)代表测试数据的组数,
接下来TT组测试数据。每组测试数据包含若干行,
第一行两个正整数N(1 \leq N \leq 1000,1 \leq M \leq 50),MN(1≤N≤1000,1≤M≤50),M。接下来NN行,每行一个字符串,代表一个 IP 地址,
再接下来MM行,每行一个字符串代表子网掩码。IP 地址和子网掩码均采用A.B.C.DA.B.C.D的形式,其中A,B,C,DA,B,C,D均为非负整数,且小于等于255。
Output
Sample Input
2 5 2 192.168.1.0 192.168.1.101 192.168.2.5 192.168.2.7 202.14.27.235 255.255.255.0 255.255.0.0 4 2 127.127.0.1 10.134.52.0 127.0.10.1 10.134.0.2 235.235.0.0 1.57.16.0
Sample Output
Case #1: 3 2 Case #2: 3 4
思路:
首先处理好四个位置的数,然后就是两重暴力,再用一个long long存起状态就OK了。
AC代码:
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<vector> #include<map> using namespace std; typedef long long ll; int a[1500][4]; int main() { #ifdef zsc freopen("input.txt","r",stdin); #endif int N,n,m,i,j,k; int ans,Cas=1; scanf("%d",&N); while(N--) { ans = 0; vector<ll> ve; scanf("%d%d",&n,&m); char str[50]; memset(a,sizeof(a)); for(i=0;i<n+m;++i){ scanf("%s",str); k = 0; for(j=0;str[j];++j){ if(str[j]=='.')k++; else a[i][k] = a[i][k]*10+str[j]-'0'; } } printf("Case #%d:\n",Cas++); for(j=0;j<m;++j){ for(i=0;i<n;++i){ ll sum = 0; for(k=0;k<4;++k) sum = sum*1000+(a[i][k]&a[n+j][k]); ve.push_back(sum); } sort(ve.begin(),ve.end()); ans = unique(ve.begin(),ve.end())-ve.begin(); printf("%d\n",ans); ve.clear(); } } return 0; }