#include <iostream>
#include <string>
#include <vector>
using namespace std;
void stringToVector(string strIn, vector<int> &vecOut)
{
string temp;
for(int i = 0; i < strIn.size(); i++) {
if(strIn[i] != '.') {
temp += strIn[i];
} else if (strIn[i] == '.'){
vecOut.push_back(stoi(temp));
temp.clear();
}
if(i == strIn.length() - 1) {
vecOut.push_back(stoi(temp));
}
}
}
/*
思路:输入字符串的’.‘为分隔符,分别获取数据段且转化为整型;掩码与ip地址进行逻辑与运算;
如果IP地址或子掩码小于0或大于255,则非法输出1;如果掩码小于255,下一个为0,否则非法格式输出1;
如果IP1与IP2属于同一子网络,则输出0;
如果ip1与ip2不属于同一子网络,则输出2.
*/
int SubNetwork(string mask, string ip1, string ip2)
{
vector<int> maskVec;
vector<int> ipVec1;
vector<int> ipVec2;
stringToVector(mask, maskVec);
stringToVector(ip1, ipVec1);
stringToVector(ip2, ipVec2);
for(int i = 0; i < 4; i++) {
if((maskVec[i] < 0 || maskVec[i] > 255) || (ipVec1[i] < 0) || (ipVec1[i] > 255)
|| (ipVec2[i] < 0) || (ipVec2[i] > 255)) {
return 1;
}
if (i < 3) {
if ((maskVec[i] < 255) && (maskVec[i+1] > 0)) {
return 1;
}
}
}
for(int i = 0; i < 3; i++) {
int f1 = maskVec[i] & ipVec1[i];
int f2 = maskVec[i] & ipVec2[i];
if(f1 != f2) {
return 2;
}
}
return 0;
}
int main()
{
string mask, ip1, ip2;
while(cin>>mask>>ip1>>ip2) {
cout<<SubNetwork(mask, ip1, ip2)<<endl;
}
return 0;
}