class Solution {
public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    bool onlyHasNum(string str) {
        int len = str.size();
        if (len == 0) {
            return false; // 没有数字
        }
        for (int i = 0; i < len; i++) {
            if (str[i] > '9' || str[i] < '0') {
                return false;
            }
        }
        return true;
    }
    bool isIpv4 (string IP){
        // ipv4中不能有:
        if (IP.find_first_of(':') != -1) {
            return false;
        }
        // 分割
        vector<string>vec;
        while(IP.find_first_of('.') != -1) {
            int pos = IP.find_first_of('.');
            string str = IP.substr(0, pos);
            vec.push_back(str);
            IP = IP.substr(pos + 1);
        }
        vec.push_back(IP);
        // 先判断个数,再逐一判断字符。
        if (vec.size() != 4) {
            return false;
        }
        // 先排除0,再转换成数字范围
        for (int i = 0; i < vec.size(); i++) {
            if (vec[i][0] == '0') {
                return false;
            }
            if (!onlyHasNum(vec[i])) {
                return false;
            }
            int num = stoi(vec[i]);
            if (num > 255 || num < 0) {
                return false;
            }
        }
        return true;
        // 通过. 分割数字,每个数字范围是0-255,放在vector中
    }
    bool isIpv6(string IP) {
        // 不能有.
        if (IP.find_first_of('.') != -1) {
            return false;
        }
 
        if ( IP.find("::") != IP.npos) {
            return false;
        }
        // 分割存在vector中
        vector<string>vec;
        while(IP.find_first_of(':') != -1) {
            int pos = IP.find_first_of(':');
            string str = IP.substr(0, pos);
            vec.push_back(str);
            IP = IP.substr(pos + 1);
        }
        vec.push_back(IP);
        // 先判断个数,再逐一判断字符。
        if (vec.size() != 8) {
            return false;
        }
        // 前面两个不能是0
        for (int i = 0; i < vec.size(); i++) {
            int tempLen = vec[i].size();
            if (tempLen <= 1) {
                continue;
            }
            if (vec[i][0] == '0' && vec[i][1] == '0') {
                return false;
            }
        }
        return true;
    }
    string solve (string IP){
        
        bool ipv4 = isIpv4(IP);
        if (ipv4) {
            return "IPv4";
        }
        bool ipv6 = isIpv6(IP);
        if (ipv6) {
            return "IPv6";
        }
        return "Neither";
    }
};