2021 网络连接 · 方案一 手写解析
逐段检查数字、前导零与取值范围
正文
// CSP-J 2021 复赛 T3 · 网络连接
// 原题:https://oj.yecheng.tv/p/CSPJ2021C
// 题意:判断地址串是不是合法的 a.b.c.d:e(五个数都非负整数、无多余前导零、
// a~d 不超过 255、e 不超过 65535)。服务机用过的地址不能重复建立;
// 客户机要连上之前建好的、地址完全相同的服务机。
// 输出:地址不合法一律 ERR;服务机重名 FAIL、成功 OK;客户机找不到 FAIL、找到就输出服务机编号。
//
// 方案一 · 手写解析(最严谨,一步一步把串拆开)
// 先按分隔符切成 5 段,同时检查分隔符的形状必须是「点 点 点 冒号」;
// 再逐段检查:只能有数字、长度不能为 0、有多余前导零不行、数值不能超上限。
// 之后用一个 map 把「地址串 -> 建好它的服务机编号」记下来即可。
#include <bits/stdc++.h>
using namespace std;
bool validPart(const string& t, int limit) {
if (t.empty()) return false;
if (t.size() > 1 && t[0] == '0') return false; // 多余前导零
long long x = 0;
for (char c : t) {
if (!isdigit((unsigned char)c)) return false;
x = x * 10 + (c - '0');
if (x > limit) return false; // 边读边判,不会溢出
}
return true;
}
bool check(const string& s) {
string part[5];
int idx = 0;
string cur;
for (size_t i = 0; i < s.size(); i++) {
char c = s[i];
if (c == '.') {
if (idx >= 3) return false; // 点只出现在前三段后面
part[idx++] = cur;
cur.clear();
} else if (c == ':') {
if (idx != 3) return false; // 冒号只能跟在第四段后面
part[idx++] = cur;
cur.clear();
} else {
cur += c;
}
}
if (idx != 4) return false;
part[4] = cur;
for (int i = 0; i < 4; i++) {
if (!validPart(part[i], 255)) return false;
}
return validPart(part[4], 65535);
}
int main() {
freopen("network.in", "r", stdin);
freopen("network.out", "w", stdout);
int n;
cin >> n;
map<string, int> server;
for (int i = 1; i <= n; i++) {
string op, ad;
cin >> op >> ad;
if (!check(ad)) {
cout << "ERR\n";
} else if (op == "Server") {
if (server.count(ad)) cout << "FAIL\n";
else {
server[ad] = i;
cout << "OK\n";
}
} else {
if (server.count(ad)) cout << server[ad] << "\n";
else cout << "FAIL\n";
}
}
return 0;
}
CSP-J 标程 · 复赛真题的其它内容
- 2019 数字游戏 · 方案一 逐字符统计
- 2019 数字游戏 · 方案二 二进制位运算
- 2020 优秀的拆分 · 方案一 贪心从大到小减
- 2020 优秀的拆分 · 方案二 直接看二进制位
- 2021 分糖果 · 方案一 枚举每个 k
- 2021 分糖果 · 方案二 看余数在哪一段
- 2022 乘方 · 方案一 边乘边判断
- 2022 乘方 · 方案二 快速幂加封顶
- 2023 小苹果 · 方案一 照规则真模拟
- 2023 小苹果 · 方案二 只盯住两个数字
- 2024 扑克牌 · 方案一 用集合去重
- 2024 扑克牌 · 方案二 二维布尔表
- 2025 拼数 · 方案一 收集后降序排序
- 2025 拼数 · 方案二 桶计数
- 2019 公交换乘 · 方案一 暴力匹配
- 2019 公交换乘 · 方案二 时间窗口优化
- 2020 直播获奖 · 方案一 每轮排序
- 2020 直播获奖 · 方案二 桶计数
- 2021 插入排序 · 方案一 每次真排一遍
- 2021 插入排序 · 方案二 增量维护有序表
- 2022 解密 · 方案一 二分求整数平方根
- 2022 解密 · 方案二 先估后校开方
- 2023 公路 · 方案一 朴素贪心
- 2023 公路 · 方案二 单调栈预处理
- 2024 地图探险 · 方案一 四方向分支写
- 2024 地图探险 · 方案二 方向数组
- 2025 座位 · 方案一 把座位表填出来
- 2025 座位 · 方案二 直接算排名
- 2019 纪念品 · 方案一 逐天完全背包
- 2019 纪念品 · 方案二 砍掉不赚钱物品
- 2020 表达式 · 方案一 每次重算后缀式
- 2020 表达式 · 方案二 建树加关键性传播
- 2021 网络连接 · 方案二 读入后回拼校验
- 2022 逻辑表达式 · 方案一 递归分治
- 2022 逻辑表达式 · 方案二 递归下降
- 2023 一元二次方程 · 方案一 照公式逐步写
- 2023 一元二次方程 · 方案二 拆成小函数
- 2024 小木棍 · 方案一 先定位数再贪心
- 2024 小木棍 · 方案二 预处理最小数字表
- 2025 异或和 · 方案一 贪心能接就接
- 2025 异或和 · 方案二 动态规划加值域数组
- 2019 加工零件 · 方案一 递归加记忆化
- 2019 加工零件 · 方案二 奇偶最短路
- 2020 方格取数 · 方案一 深搜回溯
- 2020 方格取数 · 方案二 按列动态规划
- 2021 小熊的果篮 · 方案一 每轮扫一遍
- 2021 小熊的果篮 · 方案二 链表加有序集合
- 2022 上升点列 · 方案一 先只考虑不加点
- 2022 上升点列 · 方案二 二维动态规划
- 2023 旅游巴士 · 方案一 分层图加优先队列
- 2023 旅游巴士 · 方案二 状态压成一维
- 2024 接龙 · 方案一 按定义广搜
- 2024 接龙 · 方案二 滑动窗口逐轮推进
- 2025 多边形 · 方案一 枚举所有子集
- 2025 多边形 · 方案二 排序加计数 DP