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