#include <bitset>
#include <iostream>
#include <regex>
#include <sstream>
#include <string>
using namespace std;
static regex netReg(
R"(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))");
bool isVaildIp(const string& ip) {
return regex_match(ip, netReg);
}
bool isVaildMask(const string& mask) {
if (!regex_match(mask, netReg)) return false;
stringstream ss(mask);
string segment;
unsigned long binaryMask = 0;
while (getline(ss, segment, '.')) {
binaryMask = (binaryMask << 8) | stoi(segment);
}
//cout << binary << endl;
bitset<32> b(binaryMask);
bool found = false;
for (int i = 31; i >= 0; --i) {
if (!b.test(i)) {
found = true;
} else if (found) {
return false;
}
}
return !(binaryMask == 0 || binaryMask == 0xFFFFFFFF);;
}
bitset<32> andOperate(const string ip, const string mask) {
stringstream ss(mask);
string segment;
unsigned long binaryMask = 0;
while (getline(ss, segment, '.')) {
binaryMask = (binaryMask << 8) | stoi(segment);
}
bitset<32> bmask(binaryMask);
stringstream ss2(ip);
string segment2;
unsigned long binaryIp = 0;
while (getline(ss2, segment2, '.')) {
binaryIp = (binaryIp << 8) | stoi(segment2);
}
bitset<32> bip(binaryIp);
return bip & bmask;
}
int main() {
string mask, ip1, ip2;
while (cin >> mask >> ip1 >> ip2) { // 注意 while 处理多个 case
if (isVaildMask(mask) && isVaildIp(ip1) && isVaildIp(ip2)) {
cout << (andOperate(ip1, mask) == andOperate(ip2, mask) ? 0 : 2) << endl;
} else {
cout << 1 << endl;
}
}
}