IP聚合
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
分析:
大体题意:两个数(子网掩码和IP)进行与操作后去重。主要难在去重方法上,两种方法解决去重:第一种是把每一个位置的数组合成一个12位数的一个数,然后进行判断是否相等;第二种就是用结构体的方法,每一个位置的数进行判断。
LANGUAGE:C++
CODE1:
<span style="font-size:18px;"><strong>#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
struct node{
int a,b,c,d;
};
int main()
{
int t,cnt=0;
cin>>t;
while(t--){
int n,m;
cnt++;
cin>>n>>m;
node p[1005];
long long ans[1005];
memset(p,0,sizeof(p));
for(int i=0;i<n;i++)
scanf("%d.%d.%d.%d",&p[i].a,&p[i].b,&p[i].c,&p[i].d);
int a,b,c,d;
cout<<"Case #"<<cnt<<':'<<endl;
for(int i=0;i<m;i++){
int res=0;
memset(ans,0,sizeof(ans));
scanf("%d.%d.%d.%d",&a,&b,&c,&d);
for(int j=0;j<n;j++){
ans[res++]=(a&p[j].a)*1e9+(b&p[j].b)*1e6+(c&p[j].c)*1e3+(d&p[j].d);
// cout<<ans[res-1]<<endl;
}
if(res==1){
cout<<1<<endl;
continue;
}
sort(ans,ans+res);
int sum=1;
for(int i=1;i<res;i++){
if(ans[i]!=ans[i-1])
sum++;
}
cout<<sum<<endl;
}
}
return 0;
}
</strong></span>
CODE2:
<span style="font-size:18px;"><strong>#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
int a,b,c,d;
};
int cmp(node x,node y)
{
if(x.a!=y.a)
return x.a<y.a;
else if(x.b<y.b)
return x.b<y.b;
else if(x.c<y.c)
return x.c<y.c;
else
return x.d<y.d;
}
bool judge(node x,node y)
{
if(x.a==y.a&&x.b==y.b&&x.c==y.c&&x.d==y.d)
return false;
return true;
}
int main()
{
int t,cnt=0;
cin>>t;
while(t--){
int n,m;
cnt++;
cin>>n>>m;
node p[1005];
for(int i=0;i<n;i++)
scanf("%d.%d.%d.%d",&p[i].a,&p[i].b,&p[i].c,&p[i].d);
int a,b,c,d;
cout<<"Case #"<<cnt<<':'<<endl;
for(int i=0;i<m;i++){
int res=0;
node ans[1005];
scanf("%d.%d.%d.%d",&a,&b,&c,&d);
for(int j=0;j<n;j++){
ans[res].a=a&p[j].a;
ans[res].b=b&p[j].b;
ans[res].c=c&p[j].c;
ans[res].d=d&p[j].d;
res++;
}
if(res==1){
cout<<1<<endl;
continue;
}
sort(ans,ans+res,cmp);
int sum=1;
for(int i=1;i<res;i++){
if(judge(ans[i],ans[i+1]))
sum++;
}
cout<<sum<<endl;
}
}
return 0;
}
</strong></span>