洛谷 P7911:[CSP-J 2021 T3] 网络连接 ← 字符串 + unordered_map + vector
【题目来源】https://www.luogu.com.cn/problem/P7911【题目描述】TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务就是尝试利用这个协议还原一个简化后的网络连接场景。在本问题中计算机分为两大类服务机Server和客户机Client。服务机负责建立连接客户机负责加入连接。需要进行网络连接的计算机共有 n 台编号为 1∼n这些机器将按编号递增的顺序依次发起一条建立连接或加入连接的操作。每台机器在尝试建立或加入连接时需要提供一个地址串。服务机提供的地址串表示它尝试建立连接的地址客户机提供的地址串表示它尝试加入连接的地址。一个符合规范的地址串应当具有以下特征1必须形如a.b.c.d:e的格式其中 a,b,c,d,e 均为非负整数20≤a,b,c,d≤2550≤e≤655353a,b,c,d,e 均不能含有多余的前导 0。相应地不符合规范的地址串可能具有以下特征1不是形如 a.b.c.d:e 格式的字符串例如含有多于 3 个字符 . 或多于 1 个字符 : 等情况2整数 a,b,c,d,e 中某一个或多个超出上述范围3整数 a,b,c,d,e 中某一个或多个含有多余的前导 0。例如地址串 192.168.0.255:80 是符合规范的但 192.168.0.999:80、192.168.00.1:10、192.168.0.1:088、192:168:0:1.233 均是不符合规范的。如果服务机或客户机在发起操作时提供的地址串不符合规范这条操作将被直接忽略。在本问题中我们假定凡是符合上述规范的地址串均可参与正常的连接你无需考虑每个地址串的实际意义。由于网络阻塞等原因不允许两台服务机使用相同的地址串如果此类现象发生后一台尝试建立连接的服务机将会无法成功建立连接除此之外凡是提供符合规范的地址串的服务机均可成功建立连接。如果某台提供符合规范的地址的客户机在尝试加入连接时与先前某台已经成功建立连接的服务机提供的地址串相同这台客户机就可以成功加入连接并称其连接到这台服务机如果找不到这样的服务机则认为这台客户机无法成功加入连接。请注意尽管不允许两台不同的服务机使用相同的地址串但多台客户机使用同样的地址串以及同一台服务机同时被多台客户机连接的情况是被允许的。你的任务很简单在给出每台计算机的类型以及地址串之后判断这台计算机的连接情况。【输入格式】第一行一个正整数 n。接下来 n 行每行两个字符串 op,ad按照编号从小到大给出每台计算机的类型及地址串。其中 op 保证为字符串 Server 或 Client 之一ad 为一个长度不超过 25 的仅由数字、字符 . 和字符 : 组成的非空字符串。每行的两个字符串之间用恰好一个空格分隔开每行的末尾没有多余的空格。【输出格式】输出共 n 行每行一个正整数或字符串表示第 i 台计算机的连接状态。其中如果第 i 台计算机为服务机则1如果其提供符合规范的地址串且成功建立连接输出字符串 OK。2如果其提供符合规范的地址串但由于先前有相同地址串的服务机而无法成功建立连接输出字符串 FAIL。3如果其提供的地址串不是符合规范的地址串输出字符串 ERR。如果第 i 台计算机为客户机则1如果其提供符合规范的地址串且成功加入连接输出一个正整数表示这台客户机连接到的服务机的编号。2如果其提供符合规范的地址串但无法成功加入连接时输出字符串 FAIL。3如果其提供的地址串不是符合规范的地址串输出字符串 ERR。​​​​​​​【输入样例】10Server 192.168.1.1:80Client 192.168.1.1:80Client 192.168.1.1:8080Server 192.168.1.1:80Server 192.168.1.1:8080Server 192.168.1.999:0Client 192.168.1.1.8080Client 192.168.1.1:8080Client 192.168.1.1:80Client 192.168.1.999:0【输出样例】OK1FAILFAILOKERRERR51ERR【数据范围】对于 100% 的数据保证 1≤n≤1000。【算法分析】● 本题主要考核点1. 字符串处理核心考点- 字符串分割按 . 和 : 分割 IP 与端口判断符号数量是否正确- 前导零判断01、088 属于非法0 本身合法- 字符串转数字数字范围校验0‑255、0‑65535- 空片段判断例如 192..1.1:80 分割出空字符串直接非法。2. 哈希映射STL 容器- 使用unordered_map建立【地址串→服务机编号】映射- Server检查地址是否已存在不存在就存入 map- Client直接查询 map 里有没有该地址。3. 模拟、阅读理解、细节边界- 机器编号从 1 开始按顺序处理 n 条操作- 地址不合法直接忽略操作输出 ERR- Server 合法但地址重复输出 FAIL- Client 合法地址找不到对应 Server 输出 FAIL- 大量坑点前导零、符号数量、数字越界、空片段很容易 WA。4. 边界样例坑总结- 0.0.0.0:0合法- 01.0.0.0:0前导零ERR- 1.2.3.4:0080端口前导零ERR- 256.1.1.1:10数字越界 ERR- 1.2.3:80点数量不对 ERR- 1.2.3.4.5:80点过多 ERR。提示此题不要自己拼接字符串作为 key直接拿原始输入的 ad 字符串作为 map 的键避免拼接出错。● ​​​​​​​string::find 返回类型1找到返回该字符 / 子串的下标下标从 0 开始。2没找到返回常量 string::nposnpos 的类型是 size_t。● string::npos 等于 find 函数没找到的标记string::npos 是 C 中 std::string 类的一个静态常量size_t是 C/C 标准库定义的一种无符号整数类型通常对应 unsigned int 或 unsigned long取决于平台位数。string::npos 的值为 size_t 类型能表示的最大值即32 位系统429496729564 位系统18446744073709551615。在实际开发中你不需要记住具体数值只需要知道用 string::npos 来判断查找是否失败即可。string sabcdef; size_t poss.find(x); if(posstring::npos) { //Character x was not found. }注意不要用 int 类型变量接收 find() 的返回值再与 npos 比较否则可能因为类型转换导致判断失效。​​​​​​​//wrong string sabcdef; int poss.find(x); if(pos-1) {...}● 代码 if(ad.find(:,colon_pos1)!string::npos) return false; 解析- colon_pos第一个冒号 : 的下标。-ad.find(:, colon_pos1)从下标 colon_pos1 的位置开始向后再找下一个冒号。- 如果不等于 string::npos → 又找到了一个冒号说明字符串里至少有两个冒号 :格式非法直接 return false。● 代码 string ip_partad.substr(0,colon_pos);​​​​​​​ 解析- 第一个参数起始下标从 0 开始-第二个参数截取的字符个数不是结束下标所以这句代码的含义是从下标 0 开始截取一共 colon_pos 个字符正好拿到冒号前面整段 IP 部分a.b.c.d。● ​​​​​​​自定义函数中变量 val 的类型要定义为long long型否则会有 8 个样例不过。【算法代码】#include bits/stdc.h using namespace std; bool check(string ad,int a,int b,int c,int d,int e) { size_t colon_posad.find(:); if(colon_posstring::npos) return false; if(ad.find(:,colon_pos1)!string::npos) return false; string ip_partad.substr(0,colon_pos); string port_strad.substr(colon_pos1); //Separate the ip section vectorstring ip_sec; size_t pre0; for(size_t i0; iip_part.size(); i) { if(ip_part[i].) { ip_sec.push_back(ip_part.substr(pre,i-pre)); prei1; } } ip_sec.push_back(ip_part.substr(pre)); if(ip_sec.size()!4) return false; ip_sec.push_back(port_str); //0:a,1:b,2:c,3:d,4:e //Verify each segment: leading zeros range int limit[] {255,255,255,255,65535}; int num[5]; for(int i0; i5; i) { string sip_sec[i]; if(s.empty()) return false; if(s.size()1 s[0]0) return false; long long val0; for(char ch:s) { if(!(ch0 ch9)) return false; valval*10(ch-0); } if(vallimit[i]) return false; num[i]val; } anum[0],bnum[1],cnum[2],dnum[3],enum[4]; return true; } int main() { int n; cinn; unordered_mapstring,int server_map; for(int id1; idn; id) { string op,ad; cinopad; int a,b,c,d,e; bool validcheck(ad,a,b,c,d,e); if(!valid) { coutERR\n; continue; } if(opServer) { if(server_map.count(ad)) coutFAIL\n; else { server_map[ad]id; coutOK\n; } } else { //Client if(server_map.count(ad)) coutserver_map[ad]endl; else coutFAIL\n; } } return 0; } /* in: 10 Server 192.168.1.1:80 Client 192.168.1.1:80 Client 192.168.1.1:8080 Server 192.168.1.1:80 Server 192.168.1.1:8080 Server 192.168.1.999:0 Client 192.168.1.1.8080 Client 192.168.1.1:8080 Client 192.168.1.1:80 Client 192.168.1.999:0 out: OK 1 FAIL FAIL OK ERR ERR 5 1 ERR */【参考文献】https://www.luogu.com.cn/problem/solution/P7911

相关新闻

Apktool 安装配置:从下载到跑通第一条命令(完整指南)

Apktool 安装配置:从下载到跑通第一条命令(完整指南)

Apktool 安装配置:从下载到跑通第一条命令(完整指南) 【免费下载链接】Apktool A tool for reverse engineering Android apk files 项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool Apktool 是一款用于逆向 Android APK 文…

2026/8/25 6:10:23 阅读更多 →
视觉算法工程师面试全攻略:核心维度与高频考点解析

视觉算法工程师面试全攻略:核心维度与高频考点解析

1. 视觉算法工程师面试的核心考察维度作为计算机视觉领域的从业者,我经历过数十场技术面试,也担任过多次面试官。视觉算法工程师的面试与其他软件工程岗位有着显著区别,它既要求扎实的编程基础,又需要深厚的数学功底,更…

2026/8/24 5:06:42 阅读更多 →
考研复习操作系统:动态调度认知资源的科学方法

考研复习操作系统:动态调度认知资源的科学方法

1. 这不是一张“时间表”,而是一套可动态校准的复习操作系统“考研复习计划”这五个字,每年九月起在各大高校自习室、图书馆角落、考研社群里高频出现,但绝大多数人把它理解成一张静态的Excel表格——几列时间、几行科目、一堆红红绿绿的进度…

2026/8/25 6:55:29 阅读更多 →

最新新闻

软件测试面试高频考点与实战技巧解析

软件测试面试高频考点与实战技巧解析

1. 软件测试面试的核心考察维度软件测试岗位的面试通常围绕技术能力、项目经验和思维逻辑三个维度展开。技术能力考察包括测试理论、测试工具、编程基础和数据库知识;项目经验侧重实际测试案例的讲述和分析;思维逻辑则通过场景题考察候选人的问题解决能力…

2026/8/25 9:13:04 阅读更多 →
UMA 模型实战指南:一个模型覆盖 7 个任务的原子能量与力预测

UMA 模型实战指南:一个模型覆盖 7 个任务的原子能量与力预测

UMA 模型实战指南:一个模型覆盖 7 个任务的原子能量与力预测 【免费下载链接】ocp FAIR Chemistrys library of machine learning methods for chemistry 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp DFT 逐结构计算,上千个候选筛一遍…

2026/8/25 9:12:04 阅读更多 →
字节跳动高频面试题解析与备考策略

字节跳动高频面试题解析与备考策略

1. 项目背景与核心价值作为国内头部互联网企业的技术面试题库,"字节跳动高频题专章"一直是求职者关注的焦点资源。这个题库汇集了近三年字节跳动各技术岗位(前端、后端、算法等)面试中出现频率最高的题目,包含完整的解题…

2026/8/25 9:12:04 阅读更多 →
Django Ninja CRUD DeleteView 实战教程:5分钟搞定 pre_delete/post_delete 钩子与嵌套路由设计

Django Ninja CRUD DeleteView 实战教程:5分钟搞定 pre_delete/post_delete 钩子与嵌套路由设计

Django Ninja CRUD DeleteView 实战教程:5分钟搞定 pre_delete/post_delete 钩子与嵌套路由设计 【免费下载链接】django-ninja-crud 🧩 Modular, composable API views for scalable Django Ninja projects, with built-in CRUD. 项目地址: https://g…

2026/8/25 9:12:04 阅读更多 →
FinBERT情感分析实战教程:3行代码让金融新闻与报告自动输出正面、负面、中性

FinBERT情感分析实战教程:3行代码让金融新闻与报告自动输出正面、负面、中性

FinBERT情感分析实战教程:3行代码让金融新闻与报告自动输出正面、负面、中性 【免费下载链接】FinBERT A Pretrained BERT Model for Financial Communications. https://arxiv.org/abs/2006.08097 项目地址: https://gitcode.com/gh_mirrors/finbe/FinBERT …

2026/8/25 9:12:04 阅读更多 →
Biomni|生物医学研究从自然语言到可执行代码的实战路径

Biomni|生物医学研究从自然语言到可执行代码的实战路径

Biomni|生物医学研究从自然语言到可执行代码的实战路径 【免费下载链接】Biomni Biomni: a general-purpose biomedical AI agent 项目地址: https://gitcode.com/GitHub_Trending/bi/Biomni Biomni 是一个通用生物医学 AI 智能体:你用一句自然语…

2026/8/25 9:12:04 阅读更多 →

日新闻

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

2026/8/25 0:00:34 阅读更多 →
Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

2026/8/25 0:00:34 阅读更多 →
数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

数学建模竞赛论文写作指南:从模型构建到学术表达的核心技能

1. 项目概述:从“会做”到“会写”的竞赛核心跃迁“全国大学生数学建模竞赛”,这个名字对理工科学生来说,分量极重。每年,无数团队在三天三夜的时间里,为一个开放性问题绞尽脑汁,从建立模型、求解算法到编程…

2026/8/25 0:00:34 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/24 20:22:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →