前端之家收集整理的这篇文章主要介绍了
百度之星2015 资格赛 IP聚合【水坑】,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
IP聚合
Accepts: 371
Submissions: 920
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
题解:
其实只需要统计不同的就行,用set进行标记,最后输出不同的个数就行了....
自己对set 的运行机制不够清楚,导致错了好多次,最后发现自己连最基本的函数返回值都忘记了.........(典型的自己坑自己!)
@H_
301_339@/*
http://blog.csdn.net/liuke19950717
*/
#include<cst
dio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=1005;
struct node
{
int num[5];
bool friend operator < (node a,node b)
{
for(int i=0;i<3;++i)
{
if(a.num[i]!=b.num[i])
{
return a.num[i]<b.num[i];
}
}
return a.num[3]<b.num[3];//注意必须有返回值
}
}x[maxn],y[maxn];
void slove(int n,int m)
{
set<node> vis[maxn];
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
node tp={0};
for(int k=0;k<4;++k)
{
tp.num[k]=y[i].num[k]&x[j].num[k];
}
vis[i].insert(tp);
}
}
for(int i=0;i<m;++i)
{
printf("%d\n",vis[i].size());
}
}
int main()
{
int t;
//freopen("shuju.txt","r",stdin);
scanf("%d",&t);
for(int kase=1;kase<=t;++kase)
{
printf("Case #%d:\n",kase);
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
{
scanf("%d.%d.%d.%d",&x[i].num[0],&x[i].num[1],&x[i].num[2],&x[i].num[3]);
}
for(int i=0;i<m;++i)
{
scanf("%d.%d.%d.%d",&y[i].num[0],&y[i].num[1],&y[i].num[2],&y[i].num[3]);
}
slove(n,m);
}
return 0;
}