2 条题解
-
0
各位,这题比较容易,也就耗了我个小时
为什么错呢?
没开!!
因为问题失去小时生命,我觉得连人生哲理我都感悟出来了。
进入正题。
首先,输入一个字符串。
- 若为
Server
,输入地址,不合法直接输出ERR
,否则用一个查找,若曾经没创建过,非常好输出OK
,储存,否则输出FAIL
。 Client
类似,输入地址,不合法直接输出ERR
,否则,若曾经存过该地址,非常好输出序号,否则输出FAIL
。
重点是判断是否合法的地方。
一个地址:
192.168.0.255:80
挨个遍历。
- 遇到数字,用存。没啥好弄的。
- 遇到符号,判断数字在不在范围内。
- 遍历完后,再判断一次数字是否在范围内。
code:
#include <bits/stdc++.h> using namespace std; long long n; string o,s; map <string,long long> m; bool hf(string x) { long long num = 0,cnt = 0,cnt1 = 0,cnt2 = 0;//储存数字、'.'号个数、':'号个数、数字个数 for(long long i = 0;i < x.size();i++) { if(x[i] != ':' && x[i] != '.' && !(x[i] >= '0' && x[i] <= '9')) return false;//啥也不是 if((i == 0 || x[i - 1] == '.' || x[i - 1] == ':') && x[i] >= '0' && x[i] <= '9') cnt2++;//是数字 if(x[i] >= '0' && x[i] <= '9') { if(num == 0 && x[i] == '0' && i + 1 < x.size() && (x[i + 1] >= '0' && x[i + 1] <= '9')) return false;//有前导0 num = num * 10 + int(x[i] - '0');//存数字 } else if(x[i] == '.') { if(!(num >= 0 && num <= 255)) return false;//检查储存的数字 num = 0;//置0 cnt++;//'.'符号++ if(cnt > 3) return false;//若大于3个'.'符号,不行了 if(!cnt2) return false;//没有数字,又不行了 } else if(x[i] == ':') { if(!(num >= 0 && num <= 255)) return false;//同上,下面也是(作者真懒) num = 0; cnt1++; if(cnt1 > 1) return false; if(cnt < 3 || cnt2 < 4 || !cnt2) return false; } } if(!(num >= 0 && num <= 65535)) return false;//检查最后一个数字 if(cnt != 3 || cnt1 != 1 || cnt2 != 5) return false;//检查个数 return true; } signed main() { freopen("network.in","r",stdin); freopen("network.out","w",stdout); scanf("%lld",&n); for(long long i = 1;i <= n;i++) { cin >> o >> s; if(o == "Server") { if(hf(s)) { if(!m[s])//没创建过 { printf("OK\n"); m[s] = i; } else printf("FAIL\n"); } else { printf("ERR\n"); } } else { if(hf(s)) { if(!m[s])//找不到地址 { printf("FAIL\n"); } else printf("%lld\n",m[s]); } else { printf("ERR\n"); } } } return 0; }
- 若为
信息
- ID
- 1477
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 32
- 已通过
- 9
- 上传者