#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <cstring>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <chrono>
#include <ctime>
#include <cmath>
#include <cctype>
#include <string>
#include <cstdio>
#include <iomanip>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <iterator>
using namespace std;
union MIP {
unsigned int ip;
struct IPS
{
unsigned char str[4];
}ips;
};
int main()
{
int n;
while (scanf("%d", &n) != EOF) {
MIP mip,temp, mask;
mip.ip = 0xFFFFFFFF, mask.ip = 0;
for (int i = 0; i < n; ++i) {
scanf("%d.%d.%d.%d", &temp.ips.str[0], &temp.ips.str[1], &temp.ips.str[2], &temp.ips.str[3]);
//转换成小端模式 基本都是小端模式, 所以没有判断
reverse(temp.ips.str, temp.ips.str + 4);
//mip 记录相同的
mip.ip &= temp.ip;
//记录所有元素 相等于全集
mask.ip |= temp.ip;
}
//得到不相同的
mask.ip = mask.ip ^ mip.ip;
//找最大的1
if (mask.ip == 0)mask.ip = 0xFFFFFFFF;
else {
unsigned long long int t = 0x80000000;
while (!(t & mask.ip)) t = t >> 1;
mask.ip = ~((t << 1) - 1);
}
mip.ip &= mask.ip;
reverse(mip.ips.str, mip.ips.str + 4);
reverse(mask.ips.str, mask.ips.str + 4);
printf("%d.%d.%d.%d\n", mip.ips.str[0], mip.ips.str[1], mip.ips.str[2], mip.ips.str[3]);
printf("%d.%d.%d.%d\n", mask.ips.str[0], mask.ips.str[1], mask.ips.str[2], mask.ips.str[3]);
}
return 0;
}
判断大小端
union BigSmall
{
BigSmall() :num(1) {}
unsigned int num;
struct Nums
{
unsigned char str[4];
}nums;
};
bool IsSmallMode() {
BigSmall bigsmall;
return bigsmall.nums.str[0] == 1;
}