CSP历年复赛题-P7911 [CSP-J 2021] 网络连接
原题链接:https://www.luogu.com.cn/problem/P7911
题意解读:服务器server建立连接,客户端client加入连接,建立和加入连接都要指定一个ip地址,对已经建立过连接的ip地址再次建立连接会失败,加入连接没有限制,根据要求进行输出。
解题思路:
此题有两个关键点:
1、验证IP地址的格式是符合规范的,不合规范要输出ERR
2、建立连接时,用map保存已经建立连接的IP地址,用于判断是否存在,如果不存在则建立连接成功并加IP地址和编号加入map,如果存在则FAIL
3、加入连接时,判断IP是否在map中存在,如果存在则输出IP对应的编号,如果不存在则FAIL
100分代码:
#include <bits/stdc++.h>
using namespace std;
int n;
string type, ip;
map<string, int> h;
bool check(string ip)
{
vector<int> dot; //点号的位置
vector<int> mao; //冒号的位置
for(int i = 0; i < ip.size(); i++)
{
if(ip[i] == '.') dot.push_back(i);
if(ip[i] == ':') mao.push_back(i);
}
if(dot.size() != 3 || mao.size() != 1) return false;
//判断a
int a = 0;
int l = 0, r = dot[0];
if(r - l <= 0 || r - l > 3) return false; //a长度不对
if(ip[l] == '0' && r - l > 1) return false; //a有前导0
for(int i = l; i < r; i++)
{
if(ip[i] < '0' || ip[i] > '9') return false; //a有非数字字符
a = 10 * a + ip[i] - '0';
}
if(a < 0 || a > 255) return false; //a范围不对
//判断b
int b = 0;
l = dot[0] + 1, r = dot[1];
if(r - l <= 0 || r - l > 3) return false; //b长度不对
if(ip[l] == '0' && r - l > 1) return false; //b有前导0
for(int i = l; i < r; i++)
{
if(ip[i] < '0' || ip[i] > '9') return false; //b有非数字字符
b = 10 * b + ip[i] - '0';
}
if(b < 0 || b > 255) return false; //b范围不对
//判断c
int c = 0;
l = dot[1] + 1, r = dot[2];
if(r - l <= 0 || r - l > 3) return false; //c长度不对
if(ip[l] == '0' && r - l > 1) return false; //c长度为0或者有前导0
for(int i = l; i < r; i++)
{
if(ip[i] < '0' || ip[i] > '9') return false; //c有非数字字符
c = 10 * c + ip[i] - '0';
}
if(c < 0 || c > 255) return false; //c范围不对
//判断d
int d = 0;
l = dot[2] + 1, r = mao[0];
if(r - l <= 0 || r - l > 3) return false; //d长度不对
if(ip[l] == '0' && r - l > 1) return false; //d有前导0
for(int i = l; i < r; i++)
{
if(ip[i] < '0' || ip[i] > '9') return false; //d有非数字字符
d = 10 * d + ip[i] - '0';
}
if(d < 0 || d > 255) return false; //b范围不对
//判断e
int e = 0;
l = mao[0] + 1, r = ip.size();
if(r - l <= 0 || r - l > 5) return false; //e长度不对
if(ip[l] == '0' && r - l > 1) return false; //e有前导0
for(int i = l; i < r; i++)
{
if(ip[i] < '0' || ip[i] > '9') return false; //e有非数字字符
e = 10 * e + ip[i] - '0';
}
if(e < 0 || e > 65535) return false; //e范围不对
return true;
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> type >> ip;
if(!check(ip)) cout << "ERR" << endl;
else
{
if(type == "Server")
{
if(h[ip]) cout << "FAIL" << endl;
else
{
h[ip] = i;
cout << "OK" << endl;
}
}
else if(type == "Client")
{
if(h[ip]) cout << h[ip] << endl;
else cout << "FAIL" << endl;
}
}
}
return 0;
}
分类:
CSP-J复赛真题解析
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】