1 条题解

  • 0
    @ 2026-10-26 22:50:07

    思路与算法

    逐段解析IPv4加端口,检查分隔符、范围、空段及前导零;按时间顺序只保存已成功Server及其最初编号。

    正确性说明

    解析条件逐一对应地址合法的三条规则。合法且未注册的Server才进入映射,因此映射始终恰为此前成功建立的服务;Client仅查此映射即得到正确编号或失败。非法操作不改变映射,重复Server不覆盖。

    复杂度

    O(nSlog n)时间、O(n*S)存储,其中S<=25;每段积累在越界时立即拒绝,不读成溢出整数。

    易错点

    长数字段在超过255或65535时立即返回;非法Client也必须ERR而非FAIL,服务编号是输入行号不是成功计数。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    bool valid(string s) {
        int at = 0;
        for (int k = 0; k < 5; k++) {
            int start = at, v = 0;
            while (at < (int)s.size() && isdigit(s[at])) {
                v = v * 10 + s[at++] - '0';
                if (v > (k == 4 ? 65535 : 255))
                    return false;
            }
            if (at == start || (at - start > 1 && s[start] == '0'))
                return false;
            if (k < 4) {
                char c = k == 3 ? ':' : '.';
                if (at == (int)s.size() || s[at++] != c)
                    return false;
            }
        }
        return at == (int)s.size();
    }
    int main() {
        int n;
        cin >> n;
        map<string, int> mp;
        for (int i = 1; i <= n; i++) {
            string op, s;
            cin >> op >> s;
            if (!valid(s)) {
                cout << "ERR\n";
                continue;
            }
            if (op == "Server") {
                if (mp.count(s))
                    cout << "FAIL\n";
                else {
                    mp[s] = i;
                    cout << "OK\n";
                }
            } else if (mp.count(s))
                cout << mp[s] << "\n";
            else
                cout << "FAIL\n";
        }
    }
    
    • 1

    【21CSPJ普及组】网络连接(network)

    信息

    ID
    1918
    时间
    1000ms
    内存
    512MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者