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


    Problem Description

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

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

    IP 地址:a.b.c.d

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

    Input

    第一行包含一个整数T1T50代表测试数据的组数,

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

    第一行两个正整数N1N1000,1M50,M。接下来N行,每行一个字符串,代表一个 IP 地址,

    再接下来M行,每行一个字符串代表子网掩码。IP 地址和子网掩码均采用 A.B.C.D的形式,其中ABCD均为非负整数,且小于等于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
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char s1[1100][1100],s2[55][55];
    struct edge{
        int a,b,c,d;
    }t[1100];
    bool cmp(edge i,edge j){
        if( i.a ==  j.a){
            if(i.b == j.b){
                if(i.c == j.c){
                    return i.d < j.d;
                }
                return i.c < j.c;
            }
            return i.b < j.b;
        }
        return i.a < j.a;
    }
    int main()
    {
        int n,m,T;
        edge b[55];
        edge c1[1100];
        scanf("%d",&T);
        for(int cas = 1;cas <= T;cas++){
            memset(c1,0,sizeof(c1));
            memset(b,0,sizeof(b));
            memset(t,0,sizeof(t));
            scanf("%d%d",&n,&m);
            getchar();
            for(int i = 1;  i <= n;i++){
                scanf("%s",s1[i]);
              // printf("%s",s1[i]);
              //  puts("");
                int sum = 0;
                int flag = 0;
                for(int j = 0; j < strlen(s1[i]); j++){
                    if(s1[i][j] == '.'){
                        flag++;
                        if(flag == 1){
                        t[i].a = sum;
                        sum = 0;
                        }
                        else if(flag == 2){
                        t[i].b = sum;
                        sum = 0;
                        }
                        else if(flag == 3){
                        t[i].c = sum;
                        sum = 0;
                        }
                        continue;
                    }
                    sum = sum * 10 + s1[i][j] - '0';
                }
                    t[i].d = sum;
                  //  printf("%d %d %d %d 
    ",t[i].a,t[i].b,t[i].c,t[i].d);
            }
            for(int i = 1; i <= m ;i++){
                scanf("%s",s2[i]);
               // printf("%s",s2[i]);
               // puts("");
                int sum = 0;
                int flag = 0;
                for(int j = 0; j < strlen(s2[i]); j++){
                    if(s2[i][j] == '.'){
                        flag++;
                        if(flag == 1){
                        b[i].a = sum;
                        sum = 0;
                        }
                        else if(flag == 2){
                        b[i].b = sum;
                        sum = 0;
                        }
                        else if(flag == 3){
                        b[i].c = sum;
                        sum = 0;
                        }
                        continue;
                    }
                    sum = sum * 10 + s2[i][j] - '0';
                }
                b[i].d = sum;
                   // printf("%d %d %d %d 
    ",b[i].a,b[i].b,b[i].c,b[i].d);
            }
            printf("Case #%d:
    ",cas);
            for(int i = 1; i <= m ; i++){
                for(int j = 1; j <= n; j++){
                    c1[j].a = b[i].a&t[j].a;
                    c1[j].b = b[i].b&t[j].b;
                    c1[j].c = b[i].c&t[j].c;
                    c1[j].d = b[i].d&t[j].d;
                   // printf("%d %d %d %d
    ",c1[j].a,c1[j].b,c1[j].c,c1[j].d);
                } 
            //printf("%d %d %d
    ",t[1].a,b[1].a,c1[1].a);
            sort(c1+1,c1+n+1,cmp);
           // for(int i = 1; i <= n ;i++)
           //     printf("%d %d %d %d
    ",c1[i].a,c1[i].b,c1[i].c,c1[i].d);
            int cout = 1;
            for(int i = 2; i <= n ;i++){
                if(c1[i].a == c1[i-1].a && c1[i].b == c1[i-1].b && c1[i].c == c1[i-1].c && c1[i].d == c1[i-1].d) ;
                else cout++;
            }
            printf("%d
    ",cout);
            memset(c1,0,sizeof(c1));
         }
        }
        return 0;
    }
    

      

  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4527325.html
Copyright © 2020-2023  润新知