全思路加代码
2025-08-05 09:07:58
发布于:浙江
10阅读
0回复
0点赞
看题目,题目并没有要求需要用算法求一些东西,只是要求依照题意求出机器的执行操作。
所以,我们能知道,这道题其实是一道超大模拟、
虽然模拟也不简单
思路:
优先想到输出“ERR”,因为判断这个条件是最难的事情,所以,我们需要一个函数 check() 用于判断。
题目要求,需要格式一样,并且数字没有前导零、不超过最大值就可以了。
这里要求格式一样的话可以用一个字符串把每个字符求出来最后算格式。
tmp += s[i];//s[i]表示当前遍历到的字符
if (tmp == "...:") return 1;//判断格式是否正确
要求不能有前导零的话我们可以先求出字符串的数位,再算出变成 int 后的数位
因为 int 变量自动忽略前导零。
int getlen(int x){//求出int类型的数位
int ans = 0;
if (x == 0) return 1;
while (x){
x /= 10;
ans ++;
}
return ans;
}
不超过最大值只需要定义一个变量求出数量就可以了
num = num * 10 + s[i] - '0';//num表示这一段的数的量,s[i]表示当前字符
我们的“ERR”就判断好了
具体函数如下:
int getlen(int x){
int ans = 0;
if (x == 0) return 1;
while (x){
x /= 10;
ans ++;
}
return ans;
}
bool check(string s){
string tmp;
int num = 0, cnt = 0;
for (int i = 0; i < s.size(); i ++){
if (s[i] >= '0' && s[i] <= '9'){
num = num * 10 + s[i] - '0';
cnt ++;//记录位数
}else{
if (!cnt || cnt > 3 || num > 255 || getlen(num) != cnt){
return 0;
}
tmp += s[i], num = 0, cnt = 0;
}
}
if (tmp == "...:" && cnt > 0 && cnt < 6 && num < 65536 && getlen(num) == cnt) return 1;
else return 0;
}
接下来判断“FAIL”
我们发现它的判断条件,一个是前面没有这个地址,一个是前面有这个地址。
这样,我们就可以用函数表示之前有没有这个地址。
这里补充一个知识点
map<string,int> m;//像这个容器可以直接查找每个里面有没有这个字符串
m.count(ad);//如果有则返回true 没有则返回false
最后,如果前面都没有的话,就是输出“OK”
这样本次题目就全都做出来了
别告诉我你不会输入
代码如下:
#include <bits/stdc++.h>
using namespace std;
int getlen(int x){
int ans = 0;
if (x == 0) return 1;
while (x){
x /= 10;
ans ++;
}
return ans;
}
bool check(string s){
string tmp;
int num = 0, cnt = 0;
for (int i = 0; i < s.size(); i ++){
if (s[i] >= '0' && s[i] <= '9'){
num = num * 10 + s[i] - '0';
cnt ++;//记录位数
}else{
if (!cnt || cnt > 3 || num > 255 || getlen(num) != cnt){
return 0;
}
tmp += s[i], num = 0, cnt = 0;
}
}
if (tmp == "...:" && cnt > 0 && cnt < 6 && num < 65536 && getlen(num) == cnt) return 1;
else return 0;
}
map<string,int> m;
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(m.count(ad) != 0) cout << "FAIL" << endl;
else{
cout << "OK" << endl;
m[ad] = i;
}
}else if (op == "Client"){
if(m.count(ad) == 0) cout << "FAIL" << endl;
else{
cout << m[ad] << endl;
}
}
}
return 0;
}
这样就全都AC啦。
这里空空如也
有帮助,赞一个