Skip to content

Pro3

原始文件为 CPP 代码,本文是转换后的 Markdown 文件。

#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

struct IP
{
    int a1,a2,a3,a4;
    int su;

    IP(int n1,int n2,int n3,int n4,int ns)
    {
        a1 = n1;
        a2 = n2;
        a3 = n3;
        a4 = n4;
        su = ns;
    }
};

vector<IP> iplist;
vector<bool> flag;

bool compare(IP& first,IP& second)
{
    if(first.a1 < second.a1) return true;
    if(first.a1 > second.a1) return false;
    if(first.a2 < second.a2) return true;
    if(first.a2 > second.a2) return false;
    if(first.a3 < second.a3) return true;
    if(first.a3 > second.a3) return false;
    if(first.a4 < second.a4) return true;
    if(first.a4 > second.a4) return false;
    if(first.su < second.su) return true;

    return false;
}

int compute(int a,int b)
{
    int n = a^b;
    int result = 1;
    while((n = n>>1))
        result++;

    return 8-result;
}

int samelen(IP& first,IP& second)
{
    int result = 0;
    if(first.a1 == second.a1)
        result += 8;
    else
        return compute(first.a1,second.a1);

    if(first.a2 == second.a2)
        result += 8;
    else
        return result+compute(first.a2,second.a2);

    if(first.a3 == second.a3)
        result += 8;
    else
        return result+compute(first.a3,second.a3);

    if(first.a4 == second.a4)
        result += 8;
    else
        return result+compute(first.a4,second.a4);

    return result;
}

int del(IP& first,IP& second)
{
    int len = samelen(first,second);
    int len_a = first.su;
    int len_b = second.su;

    if(len_a <= len)
    {
        return 1;
    }
    return 0;
}

int main(int args,char* argv[])
{
    /* ifstream srcFile("time15.txt",ios::in); */

    int n;
    /* srcFile >> n; */
    cin >> n;

    string str;
    for(int i=0;i<n;++i)
    {
        flag.push_back(true);
        /* srcFile >> str; */
        cin >> str;

        int len = str.size();
        int number = 1;
        int pos = 0;
        int suffix = 0;
        int address[4] = {0,0,0,0};

        for(int j=0;j<3;++j)
        {
            pos = str.find(".");
            if(-1==pos) continue;
            address[j] = stoi(str.substr(0,pos));
            str = str.substr(pos+1,len);
            number++;
        }

        pos = str.find("/");
        if(pos == -1) 
        {
            address[number-1] = stoi(str.substr(0,len));
            suffix = number*8;
        }else
        {
            address[number-1] = stoi(str.substr(0,pos));
            suffix = stoi(str.substr(pos+1,len));
        }


        iplist.push_back(IP(address[0],address[1],address[2],address[3],suffix));
    }

    sort(iplist.begin(),iplist.end(),compare);

    int index_1 = 0;
    int index_2 = 0;
    int size = n-1;
    while(index_2 < size)
    {
        index_2++;
        IP ip_a = iplist[index_1];
        IP ip_b = iplist[index_2];

        int result = del(ip_a,ip_b);

        if(result == 0)
        {
            index_1 = index_2;
        }else if(result == 1)
        {
            flag[index_2] = false;
        }
    }

    index_1 = 0;
    while(!flag[index_1]) index_1++;
    index_2 = index_1;
    int previous = -1;

    while(index_2 < n)
    {
        index_2++;
        if(!flag[index_2]) continue;

        if(iplist[index_1].su == iplist[index_2].su)
        {
            if(iplist[index_1].su == samelen(iplist[index_1],iplist[index_2])+1)
            {
                iplist[index_1].su--;
                flag[index_2] = false;
                if(previous != -1)
                { 
                    index_2 = index_1 - 1;
                    index_1 = previous;
                    continue;
                }else
                {
                    continue;
                }
            }
        }
        previous = index_1;
        index_1 = index_2;
    }

    for(int i=0;i<n;++i)
    {
        if(!flag[i]) continue;
        IP temp = iplist[i];
        cout << temp.a1 << "." ;
        cout << temp.a2 << "." ;
        cout << temp.a3 << "." ;
        cout << temp.a4 << "/" ;
        cout << temp.su << endl;
    }

    return 0;
}