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

news/2024/12/25 10:13:28/文章来源:https://www.cnblogs.com/myeln/p/18450082
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.hqwc.cn/news/809453.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站403forbidden怎么解决

遇到“403 Forbidden”错误通常表示服务器拒绝了请求访问某个资源。解决这个问题可以从以下几个方面入手: 1. 检查权限设置服务器文件权限:确认服务器上的文件和目录权限是否正确。通常文件权限应为 644,目录权限应为 755。 使用命令 chmod 和 chown 调整权限:sudo chmod -…

宝塔数据库启动不了怎么办呢

如果宝塔面板中的数据库无法启动,可以按照以下步骤进行排查和解决: 1. 检查错误日志查看日志:登录宝塔面板。 进入“软件管理”,找到相应的数据库(如 MySQL)。 点击“设置” -> “错误日志”,查看具体的错误信息。2. 检查数据库配置检查配置文件:找到数据库的配置文…

公司网站出现乱码怎么解决

解决公司网站出现乱码的问题,通常可以按照以下步骤进行:检查文件编码设置确保所有网页文件(如HTML, CSS, JavaScript等)保存时使用的编码一致,推荐使用UTF-8编码。设置正确的HTTP头部信息在服务器端设置正确的Content-Type HTTP头部,确保它指定了正确的字符集,例如:Con…

公司网站出现乱码怎么处理

处理公司网站出现乱码的问题,可以按照以下步骤进行:检查字符编码设置:确认网页和数据库的字符编码是否一致,通常推荐使用 UTF-8 编码。审查 HTTP 响应头:确保服务器正确设置了 Content-Type 响应头,指明了正确的字符集。查看 HTML 元信息:在 HTML 文档中 <head> 部…

无法连接网站,因为域名解析失败

遇到“无法连接网站,因为域名解析失败”的问题时,可以尝试以下几个步骤来解决:检查网络连接:确保您的设备已正确连接到互联网。 尝试访问其他网站,看是否能正常打开。清除DNS缓存:在Windows系统中,打开命令提示符(以管理员身份运行),输入 ipconfig /flushdns 并按回车…

织梦网站后台密码忘记?织梦dede密码忘记了

如果你忘记了织梦(Dedecms)网站后台的登录密码,可以通过以下步骤尝试找回或重置密码:数据库直接修改登录到你的MySQL数据库。 找到织梦系统对应的数据库,通常表前缀为dede_。 执行SQL语句更新管理员密码:UPDATE dede_admin SET adminpwd = MD5(新密码) WHERE id = 1;这里…

织梦密码重置工具?织梦账号密码忘记

如果忘记了织梦(Dedecms)后台的账号密码,除了直接修改数据库中的密码外,还可以使用一些专门设计用于重置织梦密码的工具。这里介绍一种简单的方法,即使用织梦密码重置工具:下载织梦密码重置工具你可以从互联网上搜索并下载一个可靠的织梦密码重置工具。确保从信誉良好的来…

公司网站预留电话修改流程

公司网站预留电话的修改流程通常涉及以下几个步骤:登录后台管理系统:使用管理员账号登录公司网站的后台管理系统。 如果不知道管理员账号,可以联系公司的IT部门或网站管理员获取权限。进入设置页面:在后台管理界面中找到“设置”、“联系方式”或“关于我们”等相关选项。 …

高级语言程序设置第二次个人作业

课程:https://edu.cnblogs.com/campus/fzu/2024C 作业要求:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 学号:102400109 姓名:袁湘湘 一,程序清单 1, 2,问题:不慎把main打成maun,且反复检查也看不到 解决:经过同学提醒发现3, 4, 5, 6,问题:反复尝…

怎么建一个自己的网站

创建自己的网站可以分为几个基本步骤:确定目标和需求:首先明确你的网站是为了什么目的,比如个人博客、企业展示还是在线销售等。 选择域名:挑选一个与你的网站主题相关且容易记忆的域名,并从域名注册商处购买。 获取主机空间:租用服务器空间来存放你的网站文件,可以选择…

网站连接数据库配置文件

网站连接数据库的配置文件通常包含数据库连接所需的各项参数。这些参数包括数据库类型、主机地址、端口号、数据库名称、用户名和密码等。下面是一些常见的数据库配置文件示例: MySQL 配置文件示例 假设你使用的是 PHP 语言,以下是一个典型的 MySQL 数据库配置文件 (db_confi…

川土微在直流充电桩上的应用,CA-IS3641HVW隔离芯片、CA-IS3417WT隔离开关、CA-IS3980P接收器

川土微隔离器芯片涵盖:标准数字隔离器、电表专用数字隔离器、集成隔离电源的标准数字隔离器、隔离I2C、隔离CAN、带隔离电源的隔离CAN、隔离RS-485/422、带隔离电源的隔离RS-485/422、低成本隔离RS-485/422、0.5W全集成隔离电源、全差分隔离运放、隔离误差运放等。充电桩控制器…