#include <string>
class Solution {
public:
    /**
    IPv4:四组一字节,十进制0-255,分割点. ,且不能有前导零,不能缺省
    IPv6:八组两字节,十六进制a-f和A-F,每组最多4位,通过冒号:分割,可以零开头,不可缺省,。
     */
    string solve(string IP) {
        if(IP.size() == 0){
            return "Neither";
        }
        
        if(IP.find('.') != string::npos){
            return isipv4(IP);
        }else if(IP.find(':') != string::npos){
            return isipv6(IP);
        }

        return "Neither";
    }

    vector<string> split(string& ip, char spliter){
        vector<string> res;

        int i=0;
        while((i = ip.find(spliter)) && i != string::npos){  //如果找到了第一个点就返回,string的find返回的是下标或者s.npos(表示未找到)
            res.push_back(ip.substr(0, i));
            ip = ip.substr(i+1);
        }

        res.push_back(ip);  //最后一节没有点使得其入栈,手动入栈
        return res;
    }


    string isipv6(string& IP){
        vector<string> ip_6 = split(IP, ':');

        if(ip_6.size() != 8)return "Neither"; 

        for(string s:ip_6){
            if(s.size() == 0 || s.size()>4){
                return "Neither";
            }

            for(char c:s){
                if( !isdigit(c) && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F') ){
                    return "Neither";
                }
            }
        }

        return "IPv6";
    }

    string isipv4(string& IP){
        vector<string> ip_4 = split(IP, '.');

        if(ip_4.size() != 4)return "Neither";  //4 groups

        for(string node:ip_4){
            if( node.size() == 0 || node.size()>3 || (node.size() != 1 && node[0]=='0') ) //不缺行,无前导零
                return "Neither";

            for(char c:node){
                if(!isdigit(c)){
                    return "Neither";  //只能是数字;
                }
            }

            int num = stoi(node);
            if(num<0 || num>255){  //数字范围
                return "Neither";
            }
        }

        return "IPv4";
    }
};