• 百度之星IP聚合(水题map&字符处理)


    虽然题目停水的,但是好像字符处理运用的还比较合适

    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 <iostream>
    #include <string>
    #include <cstdio>
    #include <map>
    using namespace std;
    string Getstr(string str){///规格化字符串(添加0)
        string temp,getstr="";
        int itl=0,itf=str.find(".");
        for(int i=0; i<3; i++){
            temp = str.substr(itl,itf-itl);
            temp.insert(0,3-temp.length(),'0');
            getstr+=temp;
            itl=itf+1,itf=str.find(".",itf+1);
        }
        temp = str.substr(itl,str.length()-itl);
        temp.insert(0,3-temp.length(),'0');
         getstr+=temp;
         return getstr;
    }
    int main (){
        int t,xx=0;
        cin>>t;
        while(t--){
            int m,n,coun=0;
            cin>>m>>n;
            string str,tab[1005];
            for(int i=0; i<m; i++){
                cin>>str;
                tab[coun++]=Getstr(str);
            }
            printf("Case #%d:
    ",++xx);
            for(int i=0; i<n; i++){
                cin>>str;
                string  temp = Getstr(str);
                map<long long ,int > m;
                for(int j=0; j<coun; j++){
                    long long sum=0;
                    for(int i=0; i<4; i++){
                        int aa=(tab[j][i*3]-'0')*100+(tab[j][i*3+1]-'0')*10+tab[j][i*3+2]-'0',bb=(temp[i*3]-'0')*100+(temp[i*3+1]-'0')*10+temp[i*3+2]-'0';
                        sum=sum*1000+(aa&bb);
                    }
                    m[sum]=0;
                }
                cout<<m.size()<<endl;
            }
        }
        return 0;
    }
    


  • 相关阅读:
    Java实现直接插入查找
    CSS hack常用方案(摘选)
    输入一个字符串,去掉重复的字符,并按ASCII值排序-华为机试
    git操作github
    简单记录下idea上配置spring
    mysql国内镜像下载网址
    tomcat启动不成功(点击startup.bat闪退)的解决办法
    Encode and Decode TinyURL
    leetcode 4Sum II
    leetcode two sum
  • 原文地址:https://www.cnblogs.com/zswbky/p/5431937.html
Copyright © 2020-2023  润新知