1 条题解
-
0
思路与算法
逐段解析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