#include<iostream>
#include<algorithm>
#include<sstream>
#include<vector>
#include<bitset>
using namespace std;
bool isNumb(string str)
{
for(int i=0;i<str.length();i++)
{
if(!isdigit(str[i])) return false;
}
return true;
}
bool isIp(string ips)
{
istringstream ins(ips);
string temp;
while(getline(ins,temp,'.'))
{
if(temp.empty()) return false;
else if(!isNumb(temp)) return false;
else{
if(strtol(temp.c_str(), NULL, 10)>255) return false;
}
}
return true;
}
bool isMask(string ips)
{
string res;
istringstream ins(ips);
string temp;
while(getline(ins,temp,'.'))
{
if(temp.empty()) return false;
else if(!isNumb(temp)) return false;
else{
long value=strtol(temp.c_str(), NULL, 10);
if(value>255) return false;
bitset<8> lSet(value);
res+=lSet.to_string();
}
}
temp=res;
sort(temp.begin(), temp.end(),[](char p1,char p2){return p1>p2;});
if(res.compare(temp)==0 && res[0]=='1' && res[temp.length()-1]=='0') return true;
return false;
}
string getBinary(string ips)
{
string res;
istringstream ins(ips);
string temp;
while(getline(ins,temp,'.'))
{
bitset<8> lSet(strtol(temp.c_str(), NULL, 10));
res+=lSet.to_string();
}
return res;
}
string andOperator(string mask,string ip)
{
string res="";
for(int i=0;i<mask.size();i++)
{
if(mask[i]=='1' && ip[i]=='1') res+="1";
else res+="0";
}
return res;
}
int main(int argc,char* argv[])
{
string maskStr="",ip1="",ip2="";
while(cin>>maskStr>>ip1>>ip2)
{
if(!isMask(maskStr)||!isIp(ip1)||!isIp(ip2)) cout<<"1"<<endl;
else{
string maskBinary=getBinary(maskStr);
string ip1Binary=getBinary(ip1);
string ip2Binary=getBinary(ip2);
if(andOperator(maskBinary,ip1Binary)==andOperator(maskBinary,ip2Binary)) cout<<"0"<<endl;
else cout<<"2"<<endl;
}
}
return 0;
}
#include<algorithm>
#include<sstream>
#include<vector>
#include<bitset>
using namespace std;
bool isNumb(string str)
{
for(int i=0;i<str.length();i++)
{
if(!isdigit(str[i])) return false;
}
return true;
}
bool isIp(string ips)
{
istringstream ins(ips);
string temp;
while(getline(ins,temp,'.'))
{
if(temp.empty()) return false;
else if(!isNumb(temp)) return false;
else{
if(strtol(temp.c_str(), NULL, 10)>255) return false;
}
}
return true;
}
bool isMask(string ips)
{
string res;
istringstream ins(ips);
string temp;
while(getline(ins,temp,'.'))
{
if(temp.empty()) return false;
else if(!isNumb(temp)) return false;
else{
long value=strtol(temp.c_str(), NULL, 10);
if(value>255) return false;
bitset<8> lSet(value);
res+=lSet.to_string();
}
}
temp=res;
sort(temp.begin(), temp.end(),[](char p1,char p2){return p1>p2;});
if(res.compare(temp)==0 && res[0]=='1' && res[temp.length()-1]=='0') return true;
return false;
}
string getBinary(string ips)
{
string res;
istringstream ins(ips);
string temp;
while(getline(ins,temp,'.'))
{
bitset<8> lSet(strtol(temp.c_str(), NULL, 10));
res+=lSet.to_string();
}
return res;
}
string andOperator(string mask,string ip)
{
string res="";
for(int i=0;i<mask.size();i++)
{
if(mask[i]=='1' && ip[i]=='1') res+="1";
else res+="0";
}
return res;
}
int main(int argc,char* argv[])
{
string maskStr="",ip1="",ip2="";
while(cin>>maskStr>>ip1>>ip2)
{
if(!isMask(maskStr)||!isIp(ip1)||!isIp(ip2)) cout<<"1"<<endl;
else{
string maskBinary=getBinary(maskStr);
string ip1Binary=getBinary(ip1);
string ip2Binary=getBinary(ip2);
if(andOperator(maskBinary,ip1Binary)==andOperator(maskBinary,ip2Binary)) cout<<"0"<<endl;
else cout<<"2"<<endl;
}
}
return 0;
}