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;
}