#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include<algorithm>
#include <cstdio>
using namespace std;
struct IP_pre{
int a[4]={0};
int plen=-1;
};
int z1[8],z2[8],z3[8];
vector<IP_pre> vec;
bool judge(IP_pre ip){
if(ip.plen==32)return true;
else if(ip.plen==0){
for(int i=0;i<4;i++){
if(ip.a[i]==0)continue;
else return false;
}
return true;
}
else if(ip.plen%8==0){
int x=ip.plen/8;
for(int i=x;i<4;i++){
if(ip.a[i]==0)continue;
else return false;
}
return true;
}
else {
int x=ip.plen/8;
int y=ip.plen%8;
for(int i=0;i<8;i++){
z3[i]=0;
}
int a=ip.a[x];
int num1=0;
do{
z3[num1++]=a%2;
a=a/2;
}while(a!=0);
for(int i=0;i<8-y;i++){
if(z3[i]!=0)return false;
}
for(int i=x+1;i<4;i++){
if(ip.a[i]!=0)return false;
}
return true;
}
return true;
}
void convert(int a,int b){
for(int i=0;i<8;i++){
z1[i]=0;
z2[i]=0;
}
int num1=0,num2=0;
do{
z1[num1++]=a%2;
a=a/2;
}while(a!=0);
do{
z2[num2++]=b%2;
b=b/2;
}while(b!=0);
}
bool cmp(IP_pre ip1,IP_pre ip2){
for(int i=0;i<4;i++){
if(ip1.a[i]==ip2.a[i])continue;
return ip1.a[i]<ip2.a[i];
}
return ip1.plen<ip2.plen;
}
void init(string s){
int pos=-1;
string s1;
IP_pre ip;
if(s.find("/")!=string::npos){
pos=s.find("/");
s1=s.substr(pos+1,s.size()-pos);
ip.plen=atoi(s1.c_str());
s=s.substr(0,pos+1);
}
int i=0;
while((pos=s.find("."))!=string::npos&&i<=3){
s1=s.substr(0,pos);
ip.a[i]=atoi(s1.c_str());
s=s.substr(pos+1,s.size()-pos);
i++;
}
if(i<4)ip.a[i]=atoi(s.c_str());
if(ip.plen==-1){
ip.plen=(i+1)*8;
}
vec.push_back(ip);
}
void ip_merge(){
for(int i=0;i<vec.size()-1;i++){
if(!judge(vec[i])){
continue;
}
for(int j=i+1;j<vec.size();j++){
if(!judge(vec[j])){
break;
}
int len=vec[i].plen;
int num=0;
int flag=1;
while(len){
if(len>=8){
if(vec[i].a[num]==vec[j].a[num]){
num++;
len-=8;
}
else {flag=0;break;}
}
else {
convert(vec[i].a[num],vec[j].a[num]);
int v=7;
while(len--){
if(z1[v]==z2[v]){v--;}
else {flag=0;break;}
}
break;
}
}
if(flag){
vec.erase(vec.begin()+j);
j--;
}else{
i++;
}
}
}
}
bool judge_set(IP_pre ip1,IP_pre ip2){
int len=ip1.plen;
int num=0;
if(len==0)return true;
while(len){
if(len>=8){
if(ip1.a[num]==ip2.a[num]){
num++;
len-=8;
}
else {return false;}
}
else {
convert(ip1.a[num],ip2.a[num]);
int v=7;
while(len--){
if(z1[v]==z2[v]){v--;}
else {return false;}
}
if(len<=0)return true;
}
}
return true;
}
void rank_merge(){
int i=0,j=1;
while(i<vec.size()&&j<vec.size()&&i<j){
if(vec[i].plen==vec[j].plen){
IP_pre ip;
ip.plen=vec[i].plen-1;
for(int x=0;x<4;x++){
ip.a[x]=vec[i].a[x];
}
if(judge(ip)){
if(judge_set(ip,vec[i])&&judge_set(ip,vec[j])){
vec.insert(vec.begin()+i,ip);
vec.erase(vec.begin()+i+1);
vec.erase(vec.begin()+i+1);
for(int j=i+1;j<vec.size();j++){
if(judge_set(ip,vec[j])){
vec.erase(vec.begin()+j);
j--;
}
else break;
}
if(i>0){
i--;
j--;
}
}
else {
i++;j++;
}
}else{
i++;j++;
}
}
else{i++;j++;}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--){
string str;
cin>>str;
init(str);
}
sort(vec.begin(),vec.end(),cmp);
ip_merge();
rank_merge();
for(int i=0;i<vec.size();i++){
cout<<vec[i].a[0]<<"."<<vec[i].a[1]<<"."<<vec[i].a[2]<<"."<<vec[i].a[3]<<"/"<<vec[i].plen<<endl;
}
}
写了好久,超时没拿满分,不知道什么原因。。。。。