class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    string solve(string IP) {
        // write code here
        string ans = "Neither";
        int n = IP.size();

        // 字符穿首字符或末尾是'.'或':'则不符合;
        if(IP.front()=='.' || IP.front()==':' || IP.back()=='.' || IP.back()==':')
            return ans;

        if(IP.find('.')!=string::npos && IP.find(':')==string::npos)
        {
            // 判断是否为有效IPv4
            int i=0;
            // 看看是不是只有四组
            int flag = 0;
            while(i<=n)
            {
                ++flag;
                int index = IP.find('.',i)!=string::npos ? IP.find('.',i) : n;
                string str = IP.substr(i,index-i);
                int str_len = str.size();
                int str_num = stoi(str);

                // 空的组、有0开头、超出范围、大于4组都不是有效IPv4
                if(str.empty() || (str.front()=='0' && str_len>1) || (str_num<0 || str_num>255) || flag>4)
                    return ans;

                // 确保str每个字符都是数字
                for(auto t:str)
                {
                    if(!isdigit(t))
                    {
                        return ans;
                    }
                }
                    
                i = index+1;  
            }

            ans = "IPv4";
        }
        else if(IP.find('.')==string::npos && IP.find(':')!=string::npos)
        {
            // 判断是否为有效IPv6
            int i=0;
            // 看看是不是只有8组
            int flag = 0;
            while(i<=n)
            {
                ++flag;
                int index = IP.find(':',i)!=string::npos ? IP.find(':',i) : n;
                string str = IP.substr(i,index-i);

                int str_len = str.size();
                // 空的组、有0开头、超出范围、大于8组都不是有效IPv6
                if(str.empty() || (str.front()=='0' && str_len>4) || flag>8)
                    return ans;

                for(auto t:str)
                {
                    if(t!='a' && t!='b' && t!='c' && t!='d' && t!='e' && t!='f' && t!='A' && t!='B' && t!='C' && t!='D' && t!='E' && t!='F' && (t-'0'<0 || t-'0'>9))
                    {
                        // cout << t << endl;
                        return ans;
                    }
                }

                i = index+1;
            }

            ans = "IPv6";
        }

        return ans;
    }
};