'commit'
This commit is contained in:
63
TangDou/CSP-J/J2-2021/3.cpp
Normal file
63
TangDou/CSP-J/J2-2021/3.cpp
Normal file
@@ -0,0 +1,63 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
int n;
|
||||
|
||||
// sscanf和sprintf详解
|
||||
// https://blog.csdn.net/qq_40563761/article/details/107087811
|
||||
/*
|
||||
sscanf与sprintf
|
||||
sscanf(str,"%d",&n) 其实就是把str的内容以"%d"的格式写入到n中(从左到右)
|
||||
同理 sprintf(str,"%d",n)就是把n以"%d"的格式写入到str (从右到左)
|
||||
*/
|
||||
bool check(string s) {
|
||||
int a, b, c, d, port;
|
||||
|
||||
//字符串格式化提取+判断转换成功个数
|
||||
if (sscanf(s.c_str(), "%d.%d.%d.%d:%d", &a, &b, &c, &d, &port) != 5) return false;
|
||||
//需符合IP地址规则
|
||||
if (a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255 || port < 0 || port > 65535)
|
||||
return false;
|
||||
|
||||
/*
|
||||
居然有这个恶心的用例:
|
||||
179.90.115.156:54168:
|
||||
|
||||
解决的办法:把分离出的数字再组装回去,和原来一样就是OK,否则就不OK!
|
||||
*/
|
||||
// if ((string)ss != s) {
|
||||
// cout << "ss=" << (string)ss << endl;
|
||||
// cout << s << endl;
|
||||
// }
|
||||
|
||||
char ss[25]; // 3*4+3+5=20
|
||||
sprintf(ss, "%d.%d.%d.%d:%d", a, b, c, d, port);
|
||||
return (string)ss == s;
|
||||
}
|
||||
|
||||
map<string, int> _map;
|
||||
string op, ip;
|
||||
|
||||
int main() {
|
||||
//文件输入
|
||||
freopen("P7911_13.in", "r", stdin);
|
||||
cin >> n;
|
||||
for (int i = 1; i <= n; i++) {
|
||||
cin >> op >> ip;
|
||||
if (!check(ip)) {
|
||||
cout << "ERR" << endl;
|
||||
continue;
|
||||
}
|
||||
if (op == "Server") {
|
||||
if (_map[ip])
|
||||
puts("FAIL");
|
||||
else
|
||||
_map[ip] = i, puts("OK");
|
||||
} else {
|
||||
if (_map[ip] == 0)
|
||||
puts("FAIL");
|
||||
else
|
||||
printf("%d\n", _map[ip]);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user