洛谷P7911 [CSP-J 2021] 网络连接题解

普通的模拟题,数据很小,基本排除超时超空间的可能

上代码:

cpp 复制代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
vector<pair<int,string>>sv;//用于存储Server,sv[i].first代表Server编号, sv[i].second代表Server地址 
int turn(string str){//string转int 
	if(str.size()>5||str.size()==0)return -1;
	if(str.size()>1&&str[0]=='0')return -1;
	int v=1,sum=0;
	stack<int>num;//存储每一位数 
	for(int c:str){//入栈 
		num.push(c-'0');
	}
	while(!num.empty()){//遍历 
		int w=num.top();
		num.pop();
		sum+=w*v;//当前数乘权值 
		v*=10;
	}
	return sum;
}
bool check(string str){
	string s[10];
	int cnt=1,cnt1=0,cnt2=0;//cnt为地址分段数(即将ip以'.'或':'为间隔分成cnt段) ,cnt1为'.'数量, cnt2为':'数量 
	for(int i=0;i<str.size();i++){
		if(str[i]=='.'){
			if(cnt2)return 0;//若前方出现过':' ,返回0 
			cnt1++;
			cnt++;
		}else if(str[i]==':'){
			if(cnt1!=3)return 0;//若前方没有3个'.' ,返回0 
			cnt2++;
			cnt++;
		}else s[cnt]+=str[i];
		
	}
	if(cnt!=5)return 0;//若地址数量不等于五 
	if(cnt1!=3||cnt2!=1)return 0;//若'.'数量不为三或':'数量不为1 
	for(int i=1;i<cnt;i++){
		int num=turn(s[i]);
		if(!(0<=num&&num<=255))return 0;
		if(num==-1)return 0;
	}
	if(!(0<=turn(s[5])&&turn(s[5])<=65535))return 0;
	return 1;
}
int find(string str){//在Servers中寻找地址为str的Server 
	for(pair<int,string> w:sv){
		if(w.second==str){//找到地址 
			return w.first;//返回下标 
		}
	}
	return 0;//不存在,返回特殊值0(地址从1开始) 
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		string op,ad;
		cin>>op>>ad;
		if(!check(ad)){
			cout<<"ERR"<<endl;
			continue;
		}
		if(op=="Server"){
			if(find(ad)){//巧妙利用整数转布尔值非0值为1的特性 
				cout<<"FAIL"<<endl;//服务器存在,连接失败 
			}else{
				cout<<"OK"<<endl;
				sv.push_back({i,ad});//服务器连接成功
			}
		}else{
			int get=find(ad);//sv中地址为ad的Server的数量 
			if(get){//若该Server存在 
				cout<<get<<endl;
			}else cout<<"FAIL"<<endl;//连接失败 
		}
	}

	return 0;
}

原题链接

相关推荐
pie_thn15 小时前
懂得编程语言的通用结构,随便哪个语言都是手拿把掐
编程
这是个栗子17 小时前
AI辅助编程工具(三) - Github Copilot
ai·编程·ai编程·github copilot
猿小羽1 天前
Flyway + Spring Boot:实现数据库迁移的最佳实践
spring boot·编程·flyway·最佳实践·数据库迁移
白帽子黑客罗哥1 天前
护网行动中遇到突发安全事件的标准应急响应流程
网络·安全·web安全·计算机·护网行动
星火开发设计1 天前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
星火开发设计2 天前
using 关键字:命名空间的使用与注意事项
开发语言·c++·学习·算法·编程·知识
计算机毕业编程指导师4 天前
大数据可视化毕设:Hadoop+Spark交通分析系统从零到上线 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·城市交通
计算机毕业编程指导师4 天前
【计算机毕设选题】基于Spark的车辆排放分析:2026年热门大数据项目 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘
大数据·hadoop·python·计算机·spark·毕业设计·车辆排放
程序员鱼皮5 天前
7个神级技巧,彻底去除网站的 AI 味儿!
计算机·ai·程序员·互联网·网站·编程经验
梁辰兴5 天前
计算机网络基础:停止等待协议
网络·计算机网络·计算机·协议·计算机网络基础·梁辰兴·停止等待协议