信息学奥赛复赛复习14-CSP-J2021-03网络连接-字符串处理、数据类型溢出、数据结构Map、find函数、substr函数

PDF文档回复:20241007

1 P7911 [CSP-J 2021] 网络连接

[题目描述]

TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务,就是尝试利用这个协议,还原一个简化后的网络连接场景。

在本问题中,计算机分为两大类:服务机(Server)和客户机(Client)。服务机负责建立连接,客户机负责加入连接

需要进行网络连接的计算机共有 n 台,编号为 1∼n,这些机器将按编号递增的顺序,依次发起一条建立连接或加入连接的操作。

每台机器在尝试建立或加入连接时需要提供一个地址串。服务机提供的地址串表示它尝试建立连接的地址,客户机提供的地址串表示它尝试加入连接的地址

一个符合规范的地址串应当具有以下特征:

必须形如 a.b.c.d:e 的格式,其中 a,b,c,d,e 均为非负整数
0≤a,b,c,d≤255,0≤e≤65535
a,b,c,d,e 均不能含有多余的前导 0

相应地,不符合规范的地址串可能具有以下特征

不是形如 a.b.c.d:e 格式的字符串,例如含有多于3 个字符 . 或多于 1 个字符 : 等情况;
整数a,b,c,d,e 中某一个或多个超出上述范围
a,b,c,d,e 中某一个或多个含有多余的前导0

例如,地址串 192.168.0.255:80 是符合规范的,但 192.168.0.999:80192.168.00.1:10192.168.0.1:088192:168:0:1.233 均是不符合规范的

如果服务机或客户机在发起操作时提供的地址串不符合规范,这条操作将被直接忽略。

在本问题中,我们假定凡是符合上述规范的地址串均可参与正常的连接,你无需考虑每个地址串的实际意义。

由于网络阻塞等原因,不允许两台服务机使用相同的地址串,如果此类现象发生,后一台尝试建立连接的服务机将会无法成功建立连接;除此之外,凡是提供符合规范的地址串的服务机均可成功建立连接。

如果某台提供符合规范的地址的客户机在尝试加入连接时,与先前某台已经成功建立连接的服务机提供的地址串相同,这台客户机就可以成功加入连接,并称其连接到这台服务机;如果找不到这样的服务机,则认为这台客户机无法成功加入连接。

请注意,尽管不允许两台不同的服务机使用相同的地址串,但多台客户机使用同样的地址串,以及同一台服务机同时被多台客户机连接的情况是被允许的。

你的任务很简单:在给出每台计算机的类型以及地址串之后,判断这台计算机的连接情况

[输入格式]

第一行,一个正整数 n

接下来 n行,每行两个字符串 op,ad,按照编号从小到大给出每台计算机的类型及地址串

其中 op 保证为字符串 ServerClient 之一,ad 为一个长度不超过 25 的,仅由数字、字符 . 和字符 : 组成的非空字符串。

每行的两个字符串之间用恰好一个空格分隔开,每行的末尾没有多余的空格

[输出格式]

输出共 n 行,每行一个正整数或字符串表示第 i台计算机的连接状态。其中:

如果第 i台计算机为服务机,则:

如果其提供符合规范的地址串且成功建立连接,输出字符串 OK。
如果其提供符合规范的地址串,但由于先前有相同地址串的服务机而无法成功建立连接,输出字符串 FAIL。
如果其提供的地址串不是符合规范的地址串,输出字符串 ERR。

如果第 i 台计算机为客户机,则:

如果其提供符合规范的地址串且成功加入连接,输出一个正整数表示这台客户机连接到的服务机的编号。
如果其提供符合规范的地址串,但无法成功加入连接时,输出字符串 FAIL。
如果其提供的地址串不是符合规范的地址串,输出字符串 ERR

[输入输出样例]

输入 #1

5
Server 192.168.1.1:8080
Server 192.168.1.1:8080
Client 192.168.1.1:8080
Client 192.168.1.1:80
Client 192.168.1.1:99999

输出 #1

OK
FAIL
1
FAIL
ERR

输入 #2

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

输出 #2

OK
1
FAIL
FAIL
OK
ERR
ERR
5
1
ERR

说明/提示

计算机 1 为服务机,提供符合规范的地址串 192.168.1.1:8080,成功建立连接;

计算机 2为服务机,提供与计算机 1 相同的地址串,未能成功建立连接;

计算机 3 为客户机,提供符合规范的地址串 192.168.1.1:8080,成功加入连接,并连接到服务机 1;

计算机 4为客户机,提供符合规范的地址串 192.168.1.1:80,找不到服务机与其连接;

计算机 5 为客户机,提供的地址串 192.168.1.1:99999 不符合规范

数据规模

对于 100% 的数据,保证 1≤n≤1000

2 相关知识点

1) 字符串

find函数

s.find(str) 查找字符串str在当前字符串s中第一次出现的位置 从0开始

#include<bits/stdc++.h>
using namespace std;
/*
s.find(str) 查找字符串str在当前字符串s中第一次出现的位置 从0开始 
*/
int main(){string str = "The apple thinks apple is delicious";//长度34string key = "e";int pos = str.find(key);// 2cout<<"e在字符串第1次出现的位置:"<<pos<<endl;key = "apple";pos = str.find(key);// 4cout<<"apple在字符串第1次出现的位置:"<<pos<<endl;return 0;
}
/*
输出
e在字符串第1次出现的位置:2
apple在字符串第1次出现的位置:4 
*/ 

substr函数

在C++中可以使用 substr ,成员函数来获取子字符串

str.substr(1,5) 从第一个位置开始 取5个字符
str.substr(1) 从第一个位置开始 取到结尾的所有字符

#include<bits/stdc++.h>
using namespace std;
/*子串 substr str.substr(1,5) 从第一个位置开始 取5个字符str.substr(1) 从第一个位置开始 取到结尾的所有字符 
*/ 
void test8(){string str="abcdefg";cout<<str<<endl;string temp=str.substr(1,5);//bcdefcout<<temp<<endl;temp = str.substr(1);//bcdefgcout<<temp<<endl;
} 
int main(){test8(); return  0;
}
/*
输出
abcdefg
bcdef
bcdefg
*/

2) 数据结构Map

C++中的std::map是一个关联容器,它存储键值对,并根据键对元素进行排序。std::map中的键是唯一的,而值可以重复。std::map通常使用红黑树实现,因此插入、删除和查找操作的时间复杂度为O(log n)

#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
/*
如果通过数字获取对应数据,比如通过学号获取学生姓名
比如string[5]={"张三","李四"},a[0] 
如果通过字符串获取,可以使用map结构 
map<string,int> mp;
key为string value为int
*/ 
int main(){mp["张三"]=2;mp["李四"]=8;cout<<"张三的学号是:"<<mp["张三"]<<endl;cout<<"李四的学号是:"<<mp["李四"];return 0;
}
/*
张三的学号是:2
李四的学号是:8
*/

3) 数据溢出

在C语言中,数据溢出是指变量在进行计算或赋值操作时超出了其数据类型所能表示的范围,导致结果不正确或不可预料的行为

例如

#include<bits/stdc++.h>
using namespace std;
int main(){char c=129;//超出了char 表示的数值范围 char最大是127printf("%d",c); return 0;
} 
/*
输出
-127 
*/

3 思路分析

1 判断地址是否合法判断.和:是否在固定位置使用find和substr函数截取分割出的数组,判断是否在对应范围内
2 判断服务器是否可以创建使用map数据结构,存储已创建的服务端,如果地址未创建过,可以创建,如果已经创建过,则不能创建
3 判断客户端是否可以加入加入对应服务器地址,如果要加入的地址创建成功,则可以加入,输出对应服务器编号如果加入的服务端,未创建成功,则输出FAIL

示例程序

#include<bits/stdc++.h>
using namespace std;
int n;//输入n个地址 
string op,ad;//op 计算机类型 ad计算机地址 
/*
服务器地址和编号映射
key为服务器地址 ,value为服务器编号
通过地址 key可以获取启动服务服务器编号 
*/ 
map<string,int> serverMap;
/*字符串转整形按位逐一转换 自动去除前导0 使用long long数据类型 是因为有些数字过大,超出了int的范围
*/
long long s2i(string s){long long ret=0;for(int i=0;i<s.length();i++){ret = ret*10+s[i]-'0';}return ret;
}
/*判断服务器地址是否合法 合法返回true 不合法返回false 
*/
bool check(string s){//cnt1记录字符.的个数 cnt2 记录字符:的个数 int cnt1=0,cnt2=0; for(int i=0;i<s.length();i++){if(s[i]=='.') cnt1++;//遇到累加 if(s[i]==':') cnt2++;//遇到累加if(cnt2==1 && cnt1!=3){//:有1个时 .必须有3个 否则不合法 return false;}}if(cnt1!=3 || cnt2!=1){//.不是3个 :不是1个都不合法 return false;}//pos 第1个.或:的位置,i通过.或: 分割出来的字符下标 int pos,i; string str[10];//分割出来字符存放str中 for(i=0;i<3;i++){pos = s.find(".");//找到第1个.的位置 str[i]=s.substr(0,pos);//截取.前面字符 s=s.substr(pos+1);//去除原字符.前面字符并去除. }pos = s.find(":");//继续找:位置 str[i]=s.substr(0,pos);//截取:前面字符 str[++i]=s.substr(pos+1);//截取:后面字符 for(int i=0;i<5;i++){//上面操作截取5个字符 放入str数组中//截取字符为空 不合法   if(str[i].length()==0) return false;//有前导0 不合法 if(str[i][0]=='0' && str[i].length()>1) return false;//字符串转数字 可能存在不合法数字范围超出int long long tmp=s2i(str[i]);if(i==4){//最后一个端口 范围判断 0~65535之间,超出不合法 if(tmp<0 || tmp>65535){return false;}}else{//地址每个数,范围判断0~255之间,超出不合法 if(tmp<0 || tmp>255){return false;}}}return true;//前面没有不合法退出,走到这里返回合法 
}int main(){cin>>n;//输入计算机个数 for(int i=1;i<=n;i++){cin>>op>>ad;//输入操作类型和计算机地址 if(!check(ad)){//如果不合法 输出ERR cout<<"ERR"<<endl;continue;//继续判断下1个 }if(op=="Server"){//如果是服务器 if(serverMap[ad]==0){//此服务器没建立过连接 cout<<"OK"<<endl;//输出OK serverMap[ad]=i;//记录此服务器地址的编号 }else{//此服务器已建立过连接 cout<<"FAIL"<<endl;//输出FAIL }}else{//客户端 if(serverMap[ad]){//加入的服务器已建立连接 cout<<serverMap[ad]<<endl;//输出连接服务器编号 }else{//加入服务器还没建立连接 cout<<"FAIL"<<endl;//无法加入 输出FAIL }	}}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556615.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3. BBP系列运动控制板(飞控板)简介

3.1. 概述 Bread Board Pilot(简称BBP) 是在积累了前期 Single Pilot 及 PH7 飞控板大量设计及使用经验的基础上&#xff0c;全新基于PH47代码框架开发的高灵活性&#xff0c; 高性能&#xff0c; 超低成本的最新一代飞控板设计。 目前&#xff0c;因为其使用便捷灵活&#xf…

Hallo部署指南

一、介绍 Hallo是由复旦大学、百度公司、苏黎世联邦理工学院和南京大学的研究人员共同提出的一个AI对口型肖像图像动画技术&#xff0c;可基于语音音频输入来驱动生成逼真且动态的肖像图像视频。 该框架采用了基于扩散的生成模型和分层音频驱动视觉合成模块&#xff0c;提高了…

【AI知识点】正则化(Regularization)

正则化&#xff08;Regularization&#xff09; 是机器学习和统计学中的一种技术&#xff0c;用于防止模型过拟合。在训练模型时&#xff0c;模型可能会过度拟合训练数据&#xff0c;导致在新数据上的表现较差。正则化通过在优化过程中引入额外的约束或惩罚项&#xff0c;使模型…

【开发心得】筑梦上海:项目风云录(6)

目录 会海跳槽 票务开启 漂泊在外的日子 未完待续 会海跳槽 随着时刻表的出炉&#xff0c;意味着大规模的界面开发逐步进入正规。项目组里陆陆续续引进了8个人&#xff0c;最多的时候&#xff0c;同时有10个人在现场。“松工”为我们准备的办公室坐的满满当当&#xff0c;…

Maven 高级之分模块设计与继承、聚合

在软件开发中&#xff0c;随着项目规模的扩大&#xff0c;代码量和复杂度不断增加&#xff0c;传统的一体化开发模式逐渐暴露出诸多问题。为了解决这些问题&#xff0c;模块化开发应运而生&#xff0c;而 Maven 正是模块化开发的利器&#xff0c;它提供的继承和聚合机制为构建和…

wc命令:统计文本行数、单词数、字节数

一、命令简介 ​wc​&#xff08;word count&#xff09;是一个在类 Unix 系统中常用的命令行工具&#xff0c;用于统计文本文件的 行数​、单词数 ​和 字节数​。 ​​ ‍ 二、命令参数 ​wc​ 命令的基本语法如下&#xff1a; wc [选项] 文件选项&#xff1a; ​-c​…

当管理遇上AI,工作效率翻了3倍!

最近这段时间&#xff0c;很多企业都开始降薪、裁员。 在降本增效的大背景下&#xff0c;企业但凡有什么大动作&#xff0c;压力往往都会转嫁到管理者的身上。 一方面&#xff0c;要调大家的状态&#xff0c;处理团队中的各种琐事&#xff1b;另一方面&#xff0c;要及时响应…

【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程

有关定时器外设的详细介绍在ESP-IDF的对应文章中&#xff0c;跳转栏目目录可以找到。 1. API 1.1 启动定时器 hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp); timer&#xff1a;定时器序号&#xff08;ESP32有4个硬件定时器&#xff0c;所以可填序…

SpringBoot赋能旅游管理:系统设计与实现

第三章 系统分析 3.1可行性分析 对所有的系统来说&#xff0c;都有可能会受到时间和空间上的制约。所以&#xff0c;我们在设计每一个项目的时候&#xff0c;必须对该系统实行可行性分析&#xff0c;这样不但能够降低项目的危害&#xff0c;还能改降低人力、物力和财力的损耗。…

【CKA】十六、监控Pod度量指标

16、监控Pod度量指标 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 题目意思是&#xff1a;找出label有namecpu-user的CPU最高的Pod&#xff0c;然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt文件里 3. 官网地址&#xff1a; https://kubernetes.io/zh-…

LeetCode 54 Spiral Matrix 解题思路和python代码

题目&#xff1a; Given an m x n matrix, return all elements of the matrix in spiral order. Example 1: Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: Input: matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] Output: [1,2,3,4,8,1…

反射在Go语言中的具体应用场景

在Go语言中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的特性&#xff0c;它允许程序在运行时检查、修改和操作变量的类型信息。 尽管反射在性能上通常不如直接操作&#xff0c;但它在某些特定场景下非常有用。 反射在Go语言中的具体应用场景&#xff1a;…

基于JAVA的鲜花商城管理系统(源码+定制+讲解)鲜花商城管理系统、鲜花商城管理平台、鲜花商城信息管理、鲜花商城系统开发与应用、鲜花在线商城管理系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

基于Springboot海宝海鲜餐厅系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

旅游管理智能化转型:SpringBoot系统设计与实现

第四章 系统设计 4.1系统结构设计 对于本系统的开发设计&#xff0c;先自上向下&#xff0c;将一个完整的系统分解成许多个小系统来进行实现&#xff1b;再自下向上&#xff0c;将所有的“零件”组装成一个大的、完整的系统。因此这里面的许多个小功能块都要对将要实现的功能进…

微软GraphRAG实战解析:全局理解力如何超越传统RAG

微软近日开源了新一代RAG框架GraphRAG&#xff0c;以解决当前RAG在大型语料库上全局理解问题。当前RAG主要聚焦于局部检索能力&#xff0c;即根据查询语句在向量库中匹配部分知识&#xff0c;然后通过大型语言模型合成这些检索到的信息&#xff0c;生成一个自然流畅的回答。相信…

【NLP自然语言处理】03 - 使用Anaconda创建新的环境/pycharm切换环境

NLP基础阶段&#xff1a;创建新的虚拟环境 第一步&#xff1a;查看有多少个虚拟环境 conda env list 第二步&#xff1a;创建一个新的虚拟环境&#xff0c;起个名字&#xff1a;nlpbase 打开anconda prompt终端&#xff0c;输入命令: conda create -n nlpbase python3.10 第三步…

数据仓库拉链表

数仓拉链表是数据仓库中常用的一种数据结构&#xff0c;用于记录维度表中某个属性的历史变化情况。在实际应用中&#xff0c;数仓拉链表可以帮助企业更好地进行数据分析和决策。 数仓拉链表&#xff08;Slowly Changing Dimension, SCD&#xff09;是一种用于处理维表中数据变化…

MATLAB中lsqminnorm函数用法

目录 语法 说明 示例 求解具有无限个解的线性系统 指定容差以减少含噪数据的影响 切换显示低秩矩阵警告 lsqminnorm函数的功能是线性方程的最小范数最小二乘解。 语法 X lsqminnorm(A,B) X lsqminnorm(A,B,tol) X lsqminnorm(___,rankWarn) 说明 X lsqminnorm(A,B…

[单master节点k8s部署]34.ingress 反向代理(一)

ingress是k8s中的标准API资源&#xff0c;作用是定义外部流量如何进入集群&#xff0c;并根据核心路由规则将流量转发到集群内的服务。 ingress和Istio工作栈中的virtual service都是基于service之上&#xff0c;更细致准确的一种流量规则。每一个pod对应的service是四层代理&…