百度快照 查看指定网站,开发商破产了购房者怎么办,成都市公园城市建设管理局网站,wordpress 不使用固定连接PDF文档回复:20241007 1 P7911 [CSP-J 2021] 网络连接
[题目描述]
TCP/IP 协议是网络通信领域的一项重要协议。今天你的任务#xff0c;就是尝试利用这个协议#xff0c;还原一个简化后的网络连接场景。
在本问题中#xff0c;计算机分为两大类#xff1a;服务机#x…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≤2550≤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: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台计算机为服务机则
如果其提供符合规范的地址串且成功建立连接输出字符串 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开始
#includebits/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);// 2coute在字符串第1次出现的位置:posendl;key apple;pos str.find(key);// 4coutapple在字符串第1次出现的位置:posendl;return 0;
}
/*
输出
e在字符串第1次出现的位置:2
apple在字符串第1次出现的位置:4
*/ substr函数
在C中可以使用 substr 成员函数来获取子字符串
str.substr(1,5) 从第一个位置开始 取5个字符 str.substr(1) 从第一个位置开始 取到结尾的所有字符
#includebits/stdc.h
using namespace std;
/*子串 substr str.substr(1,5) 从第一个位置开始 取5个字符str.substr(1) 从第一个位置开始 取到结尾的所有字符
*/
void test8(){string strabcdefg;coutstrendl;string tempstr.substr(1,5);//bcdefcouttempendl;temp str.substr(1);//bcdefgcouttempendl;
}
int main(){test8(); return 0;
}
/*
输出
abcdefg
bcdef
bcdefg
*/2) 数据结构Map
C中的std::map是一个关联容器它存储键值对并根据键对元素进行排序。std::map中的键是唯一的而值可以重复。std::map通常使用红黑树实现因此插入、删除和查找操作的时间复杂度为O(log n)
#includebits/stdc.h
using namespace std;
mapstring,int mp;
/*
如果通过数字获取对应数据比如通过学号获取学生姓名
比如string[5]{张三,李四}a[0]
如果通过字符串获取可以使用map结构
mapstring,int mp;
key为string value为int
*/
int main(){mp[张三]2;mp[李四]8;cout张三的学号是:mp[张三]endl;cout李四的学号是:mp[李四];return 0;
}
/*
张三的学号是:2
李四的学号是:8
*/3) 数据溢出
在C语言中数据溢出是指变量在进行计算或赋值操作时超出了其数据类型所能表示的范围导致结果不正确或不可预料的行为
例如
#includebits/stdc.h
using namespace std;
int main(){char c129;//超出了char 表示的数值范围 char最大是127printf(%d,c); return 0;
}
/*
输出
-127
*/3 思路分析
1 判断地址是否合法判断.和:是否在固定位置使用find和substr函数截取分割出的数组判断是否在对应范围内
2 判断服务器是否可以创建使用map数据结构存储已创建的服务端如果地址未创建过可以创建如果已经创建过则不能创建
3 判断客户端是否可以加入加入对应服务器地址如果要加入的地址创建成功则可以加入输出对应服务器编号如果加入的服务端未创建成功则输出FAIL示例程序
#includebits/stdc.h
using namespace std;
int n;//输入n个地址
string op,ad;//op 计算机类型 ad计算机地址
/*
服务器地址和编号映射
key为服务器地址 value为服务器编号
通过地址 key可以获取启动服务服务器编号
*/
mapstring,int serverMap;
/*字符串转整形按位逐一转换 自动去除前导0 使用long long数据类型 是因为有些数字过大超出了int的范围
*/
long long s2i(string s){long long ret0;for(int i0;is.length();i){ret ret*10s[i]-0;}return ret;
}
/*判断服务器地址是否合法 合法返回true 不合法返回false
*/
bool check(string s){//cnt1记录字符.的个数 cnt2 记录字符:的个数 int cnt10,cnt20; for(int i0;is.length();i){if(s[i].) cnt1;//遇到累加 if(s[i]:) cnt2;//遇到累加if(cnt21 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(i0;i3;i){pos s.find(.);//找到第1个.的位置 str[i]s.substr(0,pos);//截取.前面字符 ss.substr(pos1);//去除原字符.前面字符并去除. }pos s.find(:);//继续找:位置 str[i]s.substr(0,pos);//截取:前面字符 str[i]s.substr(pos1);//截取:后面字符 for(int i0;i5;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 tmps2i(str[i]);if(i4){//最后一个端口 范围判断 0~65535之间超出不合法 if(tmp0 || tmp65535){return false;}}else{//地址每个数范围判断0~255之间超出不合法 if(tmp0 || tmp255){return false;}}}return true;//前面没有不合法退出走到这里返回合法
}int main(){cinn;//输入计算机个数 for(int i1;in;i){cinopad;//输入操作类型和计算机地址 if(!check(ad)){//如果不合法 输出ERR coutERRendl;continue;//继续判断下1个 }if(opServer){//如果是服务器 if(serverMap[ad]0){//此服务器没建立过连接 coutOKendl;//输出OK serverMap[ad]i;//记录此服务器地址的编号 }else{//此服务器已建立过连接 coutFAILendl;//输出FAIL }}else{//客户端 if(serverMap[ad]){//加入的服务器已建立连接 coutserverMap[ad]endl;//输出连接服务器编号 }else{//加入服务器还没建立连接 coutFAILendl;//无法加入 输出FAIL } }}return 0;
}