2 条题解

  • 0
    @ 2023-6-20 21:49:27

    各位,这题比较容易,也就耗了我11个小时

    image

    为什么错呢?

    没开longlong\color{grey} long long!!

    因为longlonglong long问题失去11小时生命,我觉得连人生哲理我都感悟出来了。

    进入正题。

    首先,输入一个字符串。

    • 若为Server,输入地址,不合法直接输出ERR,否则用一个mapmap查找,若曾经没创建过,非常好输出OK,储存ms=im_s = i,否则输出FAIL
    • Client类似,输入地址,不合法直接输出ERR,否则,若mapmap曾经存过该地址,非常好输出序号,否则输出FAIL

    重点是判断是否合法的地方。

    一个地址:192.168.0.255:80

    挨个遍历。

    • 遇到数字,用numnum存。没啥好弄的。
    • 遇到符号,判断数字在不在范围内。
    • 遍历完后,再判断一次数字是否在范围内。

    code:

    #include <bits/stdc++.h>
    using namespace std;
    
    long long n;
    string o,s;
    map <string,long long> m;
    
    bool hf(string x)
    {
    	long long num = 0,cnt = 0,cnt1 = 0,cnt2 = 0;//储存数字、'.'号个数、':'号个数、数字个数
    	for(long long i = 0;i < x.size();i++)
    	{
    		if(x[i] != ':' && x[i] != '.' && !(x[i] >= '0' && x[i] <= '9')) return false;//啥也不是
    		if((i == 0 || x[i - 1] == '.' || x[i - 1] == ':') && x[i] >= '0' && x[i] <= '9') cnt2++;//是数字
    		if(x[i] >= '0' && x[i] <= '9')
    		{
    			if(num == 0 && x[i] == '0' && i + 1 < x.size() && (x[i + 1] >= '0' && x[i + 1] <= '9')) return false;//有前导0
    			num = num * 10 + int(x[i] - '0');//存数字
    		}
    		else if(x[i] == '.')
    		{
    			if(!(num >= 0 && num <= 255)) return false;//检查储存的数字
    			num = 0;//置0
    			cnt++;//'.'符号++
    			if(cnt > 3) return false;//若大于3个'.'符号,不行了
    			if(!cnt2) return false;//没有数字,又不行了
    		}
    		else if(x[i] == ':')
    		{
    			if(!(num >= 0 && num <= 255)) return false;//同上,下面也是(作者真懒)
    			num = 0;
    			cnt1++;
    			if(cnt1 > 1) return false;
    			if(cnt < 3 || cnt2 < 4 || !cnt2) return false;
    		}
    	}
    	if(!(num >= 0 && num <= 65535)) return false;//检查最后一个数字
    	if(cnt != 3 || cnt1 != 1 || cnt2 != 5) return false;//检查个数
    	return true;
    }
    
    signed main()
    {
    	freopen("network.in","r",stdin);
    	freopen("network.out","w",stdout);
    	scanf("%lld",&n);
    	for(long long i = 1;i <= n;i++)
    	{
    		cin >> o >> s;
    		if(o == "Server")
    		{
    			if(hf(s))
    			{
    				if(!m[s])//没创建过
    				{
    					printf("OK\n");
    					m[s] = i;
    				}
    				else printf("FAIL\n");
    			}
    			else
    			{
    				printf("ERR\n");
    			}
    		}
    		else
    		{
    			if(hf(s))
    			{
    				if(!m[s])//找不到地址
    				{
    					printf("FAIL\n");
    				}
    				else printf("%lld\n",m[s]);
    			}
    			else
    			{
    				printf("ERR\n");
    			}
    		}
    	}
    	return 0;
    }
    

    信息

    ID
    1477
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    32
    已通过
    9
    上传者