import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        /**
         * 若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2
         */
        String mask = "";
        String ip1 = "";
        String ip2 = "";
        mask = in.nextLine();
        ip1 = in.nextLine();
        ip2 = in.nextLine();


        String[] maskArr = mask.split("\\.");
        String[] ip1Arr = ip1.split("\\.");
        String[] ip2Arr = ip2.split("\\.");

        if (!isMaskOK(maskArr) || !isIpOK(ip1Arr) || !isIpOK(ip2Arr)) {
            System.out.println("1");
            return;
        }

        StringBuilder maskBinary = getBinaryBuilder(maskArr);
        StringBuilder ip1Binary = getBinaryBuilder(ip1Arr);
        StringBuilder ip2Binary = getBinaryBuilder(ip2Arr);
        StringBuilder maskAndIp1 = new StringBuilder();
        StringBuilder maskAndIp2 = new StringBuilder();
        for (int i = 0; i < 32; i++) {
            // 转成数字的0和1进行逻辑与
            int result1 = maskBinary.charAt(i) - '0';
            int result2 = ip1Binary.charAt(i) - '0';
            // 逻辑与运算
            maskAndIp1.append(result1 & result2);
        }
        for (int i = 0; i < 32; i++) {
            int result1 = maskBinary.charAt(i) - '0';
            int result2 = ip2Binary.charAt(i) - '0';
            maskAndIp2.append(result1 & result2);
        }
        if (maskAndIp1.toString().equals(maskAndIp2.toString())) {
            System.out.println("0");
        } else {
            System.out.println("2");
        }

    }

    private static boolean isIpOK(String[] ipArr) {
        if (jbCheckOK(ipArr)) {
            return true;
        }

        return false;
    }

    private static boolean isMaskOK(String[] maskArr) {
        // 检查4段、数字、范围
        if (!jbCheckOK(maskArr)) {
            return false;
        }


        StringBuilder binaryBuilder = getBinaryBuilder(maskArr);

        // 检查每一段前面是1,后面是0
        // 检查第一位
        if (binaryBuilder.charAt(0) != '1') {
            return false;
        }
        int zero = 1;
        for (char c : binaryBuilder.toString().toCharArray()) {
            if (c == '0') {
                zero = 0;
                // 证明该字符为1,如果zero == 0证明上次字符为0
            } else if (zero == 0) {
                return false;
            }
        }

        return true;

    }

    private static StringBuilder getBinaryBuilder(String[] arr) {
        StringBuilder binaryBuilder = new StringBuilder();
        // 转成二进制
        for (int i = 0; i < arr.length; i++) {
            String binaryString = Integer.toBinaryString(Integer.parseInt(arr[i]));
            // 0~255为8位二进制数
            while (binaryString.length() < 8) {
                binaryString += "0";
            }
            binaryBuilder.append(binaryString);
        }
        return binaryBuilder;
    }

    // 检查段数、数字、数字范围
    private static boolean jbCheckOK(String[] arr) {
        boolean ok = true;
        if (arr.length != 4) {
            ok = false;
        }

        for (int i = 0; i < arr.length; i++) {
            for (int k = 0; k < arr[i].toCharArray().length; k++) {
                // 如果不是数字
                if (!Character.isDigit(arr[i].toCharArray()[k])) {
                    ok = false;
                    break;
                }
            }

            if (!ok) {
                break;
            }
            int num = Integer.parseInt(arr[i]);
            if (num < 0 || num > 255) {
                ok = false;
                break;
            }
        }
        return ok;
    }


}