ACM学习历程—BestCoder 2015百度之星资格赛1003 IP聚合(set容器)

Problem Description

当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址。网络地址等于子网掩码与 IP 地址按位进行与运算后的结果,例如:

子网掩码:A.B.C.D

IP 地址:a.b.c.d

网络地址:(A&a).(B&b).(C&c).(D&d)

Input

第一行包含一个整数T 
,(1≤T≤50) 
代表测试数据的组数,

接下来T 
组测试数据。每组测试数据包含若干行,

第一行两个正整数N(1≤N≤1000,1≤M≤50),M 
。接下来N 
行,每行一个字符串,代表一个 IP 地址,

再接下来M 
行,每行一个字符串代表子网掩码。IP 地址和子网掩码均采用 A.B.C.D 
的形式,其中A、B、C、D 
均为非负整数,且小于等于255。

Output

对于每组测试数据,输出两行:

第一行输出: "Case #i:" 。i 
代表第i 
组测试数据。

第二行输出测试数据的结果,对于每组数据中的每一个子网掩码,输出在此子网掩码下的网络地址的数量。

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

这个题目开个结构体直接用set计数就OK。不过需要注意的是需要对运算符进行重载。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#define LL long long

using namespace std;

struct IP
{
    int a, b, c, d;
    bool operator < (const IP x) const
    {
        if (a != x.a)
            return a < x.a;
        else if (b != x.b)
            return b < x.b;
        else if (c != x.c)
            return c < x.c;
        else if (d != x.d)
            return d < x.d;
        return false;
    }
};

int n, m;
IP f[1005], t;

void Input()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i)
        scanf("%d.%d.%d.%d", &f[i].a, &f[i].b, &f[i].c, &f[i].d);
}

void Work()
{
    IP k;
    for (int i = 0; i < m; ++i)
    {
        set <IP> s;
        scanf("%d.%d.%d.%d", &t.a, &t.b, &t.c, &t.d);
        for (int j = 0; j < n; ++j)
        {
            k.a = f[j].a & t.a;
            k.b = f[j].b & t.b;
            k.c = f[j].c & t.c;
            k.d = f[j].d & t.d;
            s.insert(k);
        }
        printf("%d\n", s.size());
    }
}

int main()
{
    //freopen("test.in", "r", stdin);
    int T;
    scanf("%d", &T);
    for (int times = 1; times <= T; ++times)
    {
        Input();
        printf("Case #%d:\n", times);
        Work();
    }
    return 0;
}
时间: 2024-10-24 18:44:26

ACM学习历程—BestCoder 2015百度之星资格赛1003 IP聚合(set容器)的相关文章

ACM学习历程—BestCoder 2015百度之星资格赛1001 大搬家(递推 &amp;&amp; 组合数学)

Problem Description 近期B厂组织了一次大搬家,所有人都要按照指示换到指定的座位上.指示的内容是坐在位置i 上的人要搬到位置j 上.现在B厂有N 个人,一对一到N 个位置上.搬家之后也是一一对应的,改变的只有位次. 在第一次搬家后,度度熊由于疏忽,又要求大家按照原指示进行了一次搬家.于是,机智的它想到:再按这个指示搬一次家不就可以恢复第一次搬家的样子了.于是,B厂史无前例的进行了连续三次搬家. 虽然我们都知道度度熊的“机智”常常令人堪忧,但是不可思议的是,这回真的应验了.第三次

ACM学习历程—BestCoder 2015百度之星资格赛1002 列变位法解密(vector容器)

Problem Description 列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置任何字符,完成后按列读取即成密文. 比如: 原文:123456789 密钥:4 变换后的矩阵: 1234 5678 9xxx (最后的几个x表示无任何字符,不是空格,不是制表符,就没有任何字符,下同) 密文:159263748 再比如: 原文:Hello, welcome to my dream w

模拟 2015百度之星资格赛 1003 IP聚合

题目传送门 1 /* 2 模拟水题,排序后找出重复的ip就可以了 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 #include <string> 9 #include <cmath> 10 using namespace std; 11 12 const int MAXN = 1e3 + 10;

模拟 百度之星资格赛 1003 IP聚合

题目传送门 1 /* 2 模拟水题,排序后找出重复的ip就可以了 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 #include <string> 9 #include <cmath> 10 using namespace std; 11 12 const int MAXN = 1e3 + 10;

[百度之星]资格赛:IP聚合

保持着也不知道什么情怀,觉得到现在才能发出来.这道题做完之后看了其他人的代码,然后再看我的,不得不说,真是幼稚的很,尤其是输入这一块,都什么跟什么啊. 但相较于之前来说,不像以前慌张了,学会先思考再去写代码,明白了函数的一些用处与含义.我知道一个大四的老狗说这种话倒还真是够没面子的,但希望自己每天都在成长.你眼里的小草,我心中的大树. IP聚合 Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想

贪心/数学 2015百度之星资格赛 1004 放盘子

题目传送门 1 /* 2 贪心:小度熊先在多边形中间放一个盘子,接下来无论来访者怎么放,小度熊都根据多边形中心与来访者的盘子对称着放就能获胜. 3 题目已经给出方法,就是能否把盘子放在多边形中间,那么和边心距比较 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cmath> 8 #include <cstring> 9 using namespace std; 10 11 const i

找规律 2015百度之星资格赛 1001 大搬家

题目传送门 1 /* 2 找规律:题目真心读不懂,排列组合的题目 3 */ 4 #include <cstdio> 5 #include <iostream> 6 #include <algorithm> 7 #include <cstring> 8 using namespace std; 9 10 typedef long long ll; 11 12 const int MAXN = 1e6 + 10; 13 const int INF = 0x3f3

字符串处理 2015百度之星资格赛 1002 列变位法解密

题目传送门 1 /* 2 字符串处理:要求解码,然而二维数组开不下,可以直接输出 3 只要在余数的地方判断一下就行了,vector的效率不高 4 另外:感觉麻烦的地方应该纸上写写就清楚了 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <cstring> 10 #include <string> 11 #include <cma

2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-inverse #navbar > .navbar-nav > li > a:hover, .navbar-inverse #navbar > .navbar-nav > li > a:focus { background-image: none; background-color: