import java.util.*;
public class Main {
public static void main(String[] args) {
// 标准输入
Scanner input = new Scanner(System.in);
// 获取输入的子网掩码和两个ip地址
String mask = input.next();
String ip1 = input.next();
String ip2 = input.next();
// 解析本组数据
parse(mask, ip1, ip2);
}
// 解析数据
private static void parse(String mask, String ip1, String ip2) {
// 校验子网掩码
if (!isLegalMask(mask)) {
System.out.println(1);
return;
}
// 校验ip地址
if (!isLegal_ip(ip1) || !isLegal_ip(ip2)) {
System.out.println(1);
return;
}
// 判断两ip地址是否在同一子网
String binary_ip1 = getBinary(ip1);
String binary_ip2 = getBinary(ip2);
String binary_mask = getBinary(mask);
// 获取掩码中1的个数
int count = 0;
for (char c : binary_mask.toCharArray()) {
if (c == '1') count++;
}
// 按1的个数截取两ip的开头,比较其是否相等
String temp1 = binary_ip1.substring(0,count);
String temp2 = binary_ip2.substring(0,count);
// 判断后输出结果
if (temp1.equals(temp2)) {
System.out.println(0);
} else {
System.out.println(2);
}
}
// 判断ip地址是否合法
private static boolean isLegal_ip(String ip) {
// 正则表达式首次过滤
if (!ip.matches("(\\d+\\.){3}\\d+")) return false;
// 通过过滤的数据在形式上均为4数字+3个点
// 二次过滤
String[] nums = ip.split("\\.");
for (String num : nums) {
// 长度不为1,但以0开头
if (num.length() != 1 && num.startsWith("0")) return false;
// 数值越界
int n = Integer.parseInt(num);
if (n < 0 || 255 < n) return false;
}
// 通过过滤,校验合格
return true;
}
// 判断子网掩码是否合法
private static boolean isLegalMask(String mask) {
// 先判断其是否为合法的ip
if (!isLegal_ip(mask)) return false;
// 二次过滤,校验子网掩码的二进制形式
String binaryMask = getBinary(mask);
if (!binaryMask.matches("[1]+[0]+")) return false;
// 通过校验,子网掩码合法
return true;
}
// 将ip地址转换为二进制形式
private static String getBinary(String ip) {
// 初始化
StringBuffer binary = new StringBuffer();
// 拼接二进制形式
String[] nums = ip.split("\\.");
for (String num : nums) {
// 十进制字符串转十进制数字
int n = Integer.parseInt(num);
// 十进制数字转二进制字符串
String tempBinary = Integer.toBinaryString(n);
// 将二进制字符串补全至8位
while (tempBinary.length() < 8) {
tempBinary = "0" + tempBinary;
}
// 拼接二进制字符串
binary.append(tempBinary);
}
// 返回拼接结果
return binary.toString();
}
}