code

#include <iostream>
#include <list>
#include <sstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

struct IP
{
    string ip;
    ;
    friend bool operator<(const IP &i,const IP &j)
    {
        ,i.ip.find('/')));
        ,j.ip.find('/')));
        if(i1!=j1)
            return i1<=j1;
        else
            return i.len<=j.len;
    }
};
int str_to_int(const string &str)
{
    int num;
    stringstream ss;
    ss<<str;
    ss>>num;
    return num;
}
void format(IP &ip)
{
    int f=ip.ip.find('/');
    string sub;
    ;

    if(f!=string::npos)
    {
        //先暂存长度
        sub=ip.ip.substr(f+,ip.ip.length()-f-);
        ip.len=str_to_int(sub);

        //统计点的个数
        ;
        sub=ip.ip;
        while((f=sub.find('.'))!=string::npos)
        {
            sub=sub.substr(f+,sub.length()-f-);
            ++count_dot;
        }
        //补全ip
        )
        {
            ip.ip.erase(ip.ip.find('/'),ip.ip.length()-ip.ip.find('/'));
            ;i<-count_dot;++i)
                ip.ip.append(".0");
            ip.ip.append("/").append(to_string(ip.len));
        }
    }
    else
    {
        sub=ip.ip;
        while((f=sub.find('.'))!=string::npos)
        {
            sub=sub.substr(f+,sub.length()-f-);
            ++count_dot;
        }
        )
            ;i<-count_dot;++i)
                ip.ip.append(".0");
        ip.ip.append()*));
    }

    //存储标准型的ip中的/len
    string s=ip.ip.substr(ip.ip.find("/"),ip.ip.length()-ip.ip.find("/"));
    //存储ip
    ,ip.ip.find('/'));
    ip.ip.clear();
    char *s2=new char[s1.size()];//要为s2申请空间后才可赋值
    strcpy(s2,s1.c_str());
    vector<int> v;
    //取出以'.'分割的数
    char *p=strtok(s2,".");
    while(p)
    {
        v.push_back(str_to_int(p));
        p=strtok(NULL,".");
    }
    //变成2进制
    string s3;
    ;i<v.size();++i)
    {
        int t=v.at(i);
        while(t)
        {
            s3.append(to_string(t%));
            t/=;
        }
    }
    reverse(s3.begin(),s3.end());
    ip.ip.append(s3).append(s);
    delete []s2;
}
bool check(const IP &i,const IP &j)
{
    if(i.len>i.ip.length()||i.len>j.ip.length())
        return false;
    ,i.len,j.ip,,i.len)==?true:false;
}
int main()
{
    int n;
    cin>>n;

    IP ip;
    list<IP> l;
    //1.格式化输入;把所有输入的类型都变成标准型,ip用二进制表示
    while(n--)
    {
        cin>>ip.ip;
        format(ip);
        l.push_back(ip);
    }
    l.sort();

    //2.从小大大合并
    for(auto i=l.begin();i!=l.end();)
    {
        list<IP>::iterator next=i;
        ++next;
        if(next==l.end())
            break;

        if(check(*i,*next))
            l.erase(next);
        else
            ++i;
    }
    //3.合并同级

    for(auto i=l.begin();i!=l.end();)
    {
        list<IP>::iterator    next=i;
        ++next;
        if(next==l.end())
            break;
        IP ip1=*i;
        IP ip2=*next;
        &&ip1.ip[ip1.len-]==')
        {
            IP tmp=ip1;
            --(tmp.len);
            if(check(tmp,ip2))
            {
                l.erase(next);
                *i=tmp;
                if(i!=l.begin())
                    --i;
            }
            else
                ++next;

        }
        else
            ++i;
    }
    for(auto i=l.begin();i!=l.end();++i)
        cout<<(*i).ip<<endl;
    ;
}

CIDR合并的更多相关文章

  1. CCF 201812-3 CIDR合并

    CCF 201812-3 CIDR合并 //100分 93ms #include<stdio.h>//CCF上stdio.h比cstdio快!!! #include<string.h ...

  2. CCF-CSP题解 201812-3 CIDR合并

    题目想求与给定前缀列表等价的包含IP前缀数目最少的前缀列表. 首先是怎么存储前缀列表.用一个long long存储IP地址,再存一个前缀长度,封装在一个结构体里\(<ipNum, len> ...

  3. CCF201812-3 CIDR合并

    按题意模拟即可...主要CCF吞代码... #include<bits/stdc++.h> #define pb push_back #define mp make_pair #defin ...

  4. CCF-CSP认证 C++题解目录

    持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...

  5. CIDR

    CIDR的介绍: CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类.B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空 ...

  6. 无分类编址(CIDR)构成超网

    CIDR(无分类域间路由选择) CIDR最主要有两个以下特点: 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码.记法:IP地址::= ...

  7. 第5章 子网划分和CIDR

    第5章 子网划分和CIDR 划分网络 根据A类.B类或C类网络ID来识别网段具有一些局限性,主要是在网络级别之下不能对地址空间进行任何逻辑细分 如果一个IP是一个A类网络.数据报到达网关,然后传输到9 ...

  8. 无分类编址(CIDR,Class Inter-Domain-Routing)

    CIDR全称是无分类域间路由选择,英文全称是Classless Inter-Domain Routing,大家多称之为无分类编址 CIDR的特点 (1)CIDR消除了传统的A类.B类和C类地址以及划分 ...

  9. IP地址和CIDR

    IP地址(IPV4) IPV4的地址是一个32位的二进制数,由网络ID和主机ID两部分组成,用来在网络中唯一的标识一台计算机.IP地址通常用四组3位的十进制数表示,中间用.分割,例如:192.168. ...

随机推荐

  1. 栈回溯简单实现(x86)

    0x01  栈简介  首先局部变量的分配释放是通过调整栈指针实现的,栈为函数调用和定义局部变量提供了一块简单易用的空间,定义在栈上的变量不必考虑内存申请和释放.只要调整栈指针就可以分配和释放内存.   ...

  2. spring相关jar包的作用讲解(转)

    Spring各个jar包作用 原文链接:https://www.cnblogs.com/1995hxt/p/5255210.html    Spring AOP:Spring的面向切面编程,提供AOP ...

  3. 牛客多校第四场 G Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...

  4. webstorm安装流程

    第一步:双击安装目录 修改安装目录 尽量不要放在C盘 第二步: 把汉化包 直接复制文件到WebStorm安装目录中lib文件夹中即可,重新打开WebStorm就可以了

  5. 初识Linux------虚拟机VM三种配置网络的解说

    桥接模式: 相当于在物理主机与虚拟机网卡之间架设了一座桥梁,从而可以通过物理主机的网卡访问外网. NAT模式: 让 VM 虚拟机的网络服务发挥路由器的作用,使得通过虚拟机软件模拟的主机可以通过物理主 ...

  6. outlook vba开发要点

    1.学学基础的VB语法 https://www.yiibai.com/vba/vba_programming_charts.html 2.找一个样例看看 VBA编程实现自动回复邮件 https://b ...

  7. 常见Web应用程序漏洞

    不完善的身份验证措施 .这类漏洞包括应用程序登录机制中的各种缺陷,可能会使攻击者破解保密性不强的密码.发动蛮力攻击或完全避开登录. 不完善的访问控制措施.这一问题涉及的情况包括:应用程序无法为数据和功 ...

  8. 豆瓣电影 Top 250

    import refrom urllib.request import urlopen def getPage(url): # 获取网页的字符串 response = urlopen(url) ret ...

  9. WEBBASE篇: 第一篇, HTML知识1

    HTML知识1 1,web概述 WEB就是互联网上的一种应用程序 - 网页程序: 程序结构: (1)C / S: C:Client 客户端:S:Server 服务器: (2)B / S: B:Brow ...

  10. shell 脚本中将输出内容赋值给一个变量时的换行问题

    for ((i=0; i<4; i++) do ....... done 如果使用 echo $a 输出变量,则变量中的 换行都会被忽略掉,所有内容输出到一行 而使用 echo "$a ...