You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}