#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
// 判断IP地址是否合法
bool judge_ip(const string& ip) {
int j = 0;
istringstream iss(ip);
string seg;
while (getline(iss, seg, '.')) {
if (++j > 4 || seg.empty() || seg.size() > 3) return false;
for (char c : seg) {
if (!isdigit(c)) return false;
}
int val = stoi(seg);
if (val < 0 || val > 255) return false;
}
return j == 4;
}
// 判断子网掩码是否合法
bool is_mask(const string& mask) {
if (!judge_ip(mask)) return false; // 先检查是否为合法IP
istringstream iss(mask);
string seg;
unsigned b = 0;
while (getline(iss, seg, '.')) {
b = (b << 8) + stoi(seg);
}
if (b == 0 || b == 0xFFFFFFFF) return false; // 全0或全1非法
b = ~b + 1;
return (b & (b - 1)) == 0; // 判断是否为连续的1和0
}
// 判断两个IP地址是否在同一个子网
bool isSameIp(const string& mask, const string& ip1, const string& ip2) {
auto ipToInt = [](const string& ip) {
istringstream iss(ip);
string seg;
unsigned val = 0;
while (getline(iss, seg, '.')) {
val = (val << 8) + stoi(seg);
}
return val;
};
unsigned maskVal = ipToInt(mask);
unsigned ip1Val = ipToInt(ip1);
unsigned ip2Val = ipToInt(ip2);
return (maskVal & ip1Val) == (maskVal & ip2Val);
}
int main() {
string mask, ip1, ip2;
while (cin >> mask >> ip1 >> ip2) {
if (!is_mask(mask) || !judge_ip(ip1) || !judge_ip(ip2)) {
cout << 1 << endl;
continue;
}
if (isSameIp(mask, ip1, ip2)) {
cout << 0 << endl;
} else {
cout << 2 << endl;
}
}
return 0;
}