#include<bits/stdc++.h> #define _for(i,a,b) for(int i=a;i<b;i++) using namespace std; const string dic[4] = {"/8", "/16", "/24", "/32"}; struct IP{ int a, b, c, d, base, delta; int suffix; IP(int a = 0, int b = 0, int c = 0, int d = 0, int suffix = 0):a(a), b(b), c(c), d(d), suffix(suffix){ base = a*256*256*256 + b*256*256 + c*256 + d; delta = 1<<(32 - suffix); } bool operator<(const IP& ip)const{ return a != ip.a ? a < ip.a : (b != ip.b ? b < ip.b : (c != ip.c ? c < ip.c : d < ip.d)); } bool operator==(const IP& ip)const{ return a == ip.a && b == ip.b && c == ip.c && d == ip.d; } }; vector<IP>ips; IP getIP(string& ip) { for(int i = 0; i < ip.size(); i++) if(ip[i] == '.' || ip[i] == '/') ip[i] = ' '; stringstream ss(ip); int a, b, c, d, n; ss >> a >> b >> c >> d >> n; return IP(a, b, c, d, n); } void insertToIPList(string& s) { string ss = s.substr(0, s.find('/') == -1 ? s.size() : s.find('/')); //1.获取前面的点分十进制部分 int cnt = 0, pos = -1; for(int i = 0; i < s.size(); i++){ if(s[i] == '.'){ cnt++; pos = i; } } for(int i = 0; i < 3 - cnt; i++){ ss += ".0"; } //2.获取掩码位数 if(s.find('/') != -1){ ss += s.substr(s.find('/'), s.size() - s.find('/')); }else{ ss += dic[cnt]; } //cout << ss << endl; ips.push_back(getIP(ss)); } bool ip1_Include_ip2(IP& ip1, IP& ip2) { int l1 = ip1.base, r1 = l1 + ip1.delta; int l2 = ip2.base, r2 = l2 + ip2.delta; return l1 <= l2 && r1 >= r2; } void union1() { int n = ips.size(); for(int i = 0; i < n - 1; i++){ if(ips[i].base != -1) for(int j = i + 1; j < n; j++){ if(ips[j].base != -1) if(ip1_Include_ip2(ips[i], ips[j])){ ips[j].base = -1; } } } vector<IP>ipss; for(int i = 0; i < n; i++){ if(ips[i].base != -1){ ipss.push_back(ips[i]); } } ips.clear(); ips = ipss; } void union2() { int n = ips.size(); for(int i = 0; i < n - 1;){ int j = i + 1; while(j < n && ips[j].base == -1) j++; if(j == n){ i++; continue; } IP& a = ips[i]; IP& b = ips[j]; if(a.suffix == b.suffix && a.base + a.delta == b.base){ IP c(a.a, a.b, a.c, a.d, a.suffix - 1); ips[i] = c; b.base = -1; for(int j = i - 1; j >= 0; j--){ if(ips[j].base != -1){ i = j; break; } } }else{ i++; } } vector<IP>ipss; for(int i = 0; i < n; i++){ if(ips[i].base != -1){ ipss.push_back(ips[i]); } } ips.clear(); ips = ipss; } int main() { int n; cin >> n; while(n--){ string s; cin >> s; insertToIPList(s); } sort(ips.begin(), ips.end()); union1(); union2(); for(IP &ip : ips) cout << ip.a << '.' << ip.b << '.' << ip.c << '.' << ip.d << '/' << ip.suffix <<endl; return 0; } /* 101.6.6.0/24 101.6.6.128/25 101.6.6.0/24 101.6.7.0/24 */