import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        /*0~255 非则不合法 子网掩码 前面全1 后面全0 否则不合法
         * A类 1~126 B类 128~191 C类 192~223 D类 224~239 E类 240~255
         * 类似于"0.*.*.*"和"127.*.*.*"的IP地址不属于上述的任意一类 也不属于不合法的IP地址*/
        /*
        * 10.70.44.68~1.1.1.5
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0*/
        Scanner scanner = new Scanner(System.in);

        String IPAndSubnetMaskStrings="";
        while (scanner.hasNextLine()){
            String input=scanner.nextLine().trim();
            if (input.equals("")){
                break;
            }
            IPAndSubnetMaskStrings+=input;
            IPAndSubnetMaskStrings+=" ";
        }
        String[] IPAndSubnetMask = IPAndSubnetMaskStrings.split(" ");//将字符串分为单个的IP和子网掩码
        String[] IP = new String[IPAndSubnetMask.length];//IP数组
        String[] SubnetMask = new String[IPAndSubnetMask.length];//IPSubnetMask数组

        //初始化需要的相关数据类型
        int AIPAddress = 0, BIPAddress = 0, CIPAddress = 0, DIPAddress = 0, EIPAddress = 0;
        int privateIpAddress = 0;
        int numberOfIncorrectIPOrSubnetMasks = 0;

        boolean flag=true;

        for (int i = 0; i < IPAndSubnetMask.length; i++) {//遍历数组 将IP和子网掩码分别存储在对应的数组中
            IP[i] = IPAndSubnetMask[i].split("~")[0];
            SubnetMask[i] = IPAndSubnetMask[i].split("~")[1];//获取每个IP和对应的子网掩码
//           System.out.println(IP[i]+"~"+SubnetMask[i]);
            //判断IP合法性和类别 合法性 以.号分隔 若小于0大于255不合法 然后判断五类类别 根据第一位判断
            //私有类别等于10或172.(16~31)或192.168
            int _1IP = 0, _2IP = 0, _3IP = 0, _4IP = 0, _1SubnetMask = 0, _2SubnetMask = 0, _3SubnetMask = 0, _4SubnetMask = 0;
            try {
                _1IP = Integer.parseInt(IP[i].split("\\.")[0]);
                _2IP = Integer.parseInt(IP[i].split("\\.")[1]);
                _3IP = Integer.parseInt(IP[i].split("\\.")[2]);
                _4IP = Integer.parseInt(IP[i].split("\\.")[3]);
                _1SubnetMask = Integer.parseInt(SubnetMask[i].split("\\.")[0]);
                _2SubnetMask = Integer.parseInt(SubnetMask[i].split("\\.")[1]);
                _3SubnetMask = Integer.parseInt(SubnetMask[i].split("\\.")[2]);
                _4SubnetMask = Integer.parseInt(SubnetMask[i].split("\\.")[3]);
            } catch (Exception e) {
                /*System.out.println("IP地址" + IP[i] + "不合法");*///这里捕获到 IP空串异常后 数量+1 但是
                numberOfIncorrectIPOrSubnetMasks++;
                flag=false;
            }
            if (_1IP < 0 || _1IP > 255 || _2IP < 0 || _2IP > 255 || _3IP < 0 || _3IP > 255 || _4IP < 0 || _4IP > 255) {
                /*System.out.println("IP地址" + IP[i] + "不合法");*/
                numberOfIncorrectIPOrSubnetMasks++;
            } else if (_1IP == 0 || _1IP == 127) {
                //System.out.println("不属于五类IP地址 也不属于合法IP地址");
            } else {
                //IP地址合法后判断子网掩码是否合法 合法后进行统计 否则舍去
                if (_1SubnetMask < 0 || _1SubnetMask > 255 || _2SubnetMask < 0 || _2SubnetMask > 255
                        || _3SubnetMask < 0 || _3SubnetMask > 255 || _4SubnetMask < 0 || _4SubnetMask > 255
                        || (_1SubnetMask == 255 && _2SubnetMask == 255 && _3SubnetMask == 255 && _4SubnetMask == 255) ||
                        (_1SubnetMask == 0 && _2SubnetMask == 0 && _3SubnetMask == 0 && _4SubnetMask == 0)
                        || !isValidSubnetMask(SubnetMask[i])
                ) {
                    /*System.out.println("子网掩码" + SubnetMask[i] + "不合法");*/
                    if (flag==false){

                    }else {
                        numberOfIncorrectIPOrSubnetMasks++;
                    }
                } else {
                    if (_1IP >= 1 && _1IP <= 126) {
                        /*System.out.println("A类地址");*/
                        AIPAddress++;
                        if (_1IP == 10) {
                            /*System.out.println("私有IP地址");*/
                            privateIpAddress++;
                        }
                    } else if (_1IP >= 128 && _1IP <= 191) {
                        /*System.out.println("B类地址");*/
                        BIPAddress++;
                        if (_1IP == 172 && _2IP >= 16 && _2IP <= 31) {
                            /*System.out.println("私有IP地址");*/
                            privateIpAddress++;
                        }
                    } else if (_1IP >= 192 && _1IP <= 223) {
                        /*System.out.println("C类地址");*/
                        CIPAddress++;
                        if (_1IP == 192 && _2IP == 168) {
                            /*System.out.println("私有IP地址");*/
                            privateIpAddress++;
                        }

                    } else if (_1IP >= 224 && _1IP <= 239) {
                        /*System.out.println("D类地址");*/
                        DIPAddress++;

                    } else if (_1IP >= 240 && _1IP <= 255) {
                        /*System.out.println("E类地址");*/
                        EIPAddress++;
                    }
                }

            }
        }
        System.out.println(AIPAddress+" "+BIPAddress+" "+CIPAddress+" "
                +DIPAddress+" "+EIPAddress+" "+numberOfIncorrectIPOrSubnetMasks+" "+privateIpAddress);
    }

    public static boolean isValidSubnetMask(String subnetMask) {
        // 将IP地址转换为32位二进制字符串
        String binary = ipToBinary(subnetMask);
        if (binary == null) return false;

        // 检查是否由连续的1后跟连续的0组成
        boolean foundZero = false;
        for (char c : binary.toCharArray()) {
            if (c == '0') {
                foundZero = true;
            } else if (foundZero && c == '1') {
                // 发现0之后又出现1,不符合要求
                return false;
            }
        }
        return true;
    }

    private static String ipToBinary(String ip) {
        try {
            String[] octets = ip.split("\\.");
            if (octets.length != 4) return null;

            StringBuilder binary = new StringBuilder(32);
            for (String octet : octets) {
                int value = Integer.parseInt(octet);
                if (value < 0 || value > 255) return null;
                binary.append(String.format("%8s", Integer.toBinaryString(value)).replace(' ', '0'));
            }
            return binary.toString();
        } catch (NumberFormatException e) {
            return null;
        }
    }
}