58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
|
|
#include <bits/stdc++.h>
|
||
|
|
using namespace std;
|
||
|
|
|
||
|
|
int w[5];
|
||
|
|
bool check(string addr) {
|
||
|
|
memset(w, -1, sizeof w);
|
||
|
|
// 使用 stringstream 替代 sscanf
|
||
|
|
stringstream ss(addr);
|
||
|
|
char dot1, dot2, dot3, colon;
|
||
|
|
ss >> w[0] >> dot1 >> w[1] >> dot2 >> w[2] >> dot3 >> w[3] >> colon >> w[4];
|
||
|
|
|
||
|
|
// 验证格式是否正确
|
||
|
|
if (dot1 != '.' || dot2 != '.' || dot3 != '.' || colon != ':')
|
||
|
|
return false;
|
||
|
|
|
||
|
|
// 验证数值范围
|
||
|
|
for (int i = 0; i < 5; i++) {
|
||
|
|
if (w[i] < 0)
|
||
|
|
return false;
|
||
|
|
if (i < 4 && w[i] > 255)
|
||
|
|
return false;
|
||
|
|
if (i == 4 && w[i] > 65535)
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 验证转换后的字符串是否与原字符串相同
|
||
|
|
stringstream ss2;
|
||
|
|
ss2 << w[0] << '.' << w[1] << '.' << w[2] << '.' << w[3] << ':' << w[4];
|
||
|
|
return ss2.str() == addr;
|
||
|
|
}
|
||
|
|
|
||
|
|
int main() {
|
||
|
|
int n;
|
||
|
|
cin >> n;
|
||
|
|
unordered_map<string, int> hash;
|
||
|
|
for (int i = 1; i <= n; i++) {
|
||
|
|
string type, addr;
|
||
|
|
cin >> type >> addr;
|
||
|
|
if (type == "Server") {
|
||
|
|
if (!check(addr))
|
||
|
|
puts("ERR");
|
||
|
|
else if (hash.count(addr))
|
||
|
|
puts("FAIL");
|
||
|
|
else {
|
||
|
|
hash[addr] = i;
|
||
|
|
puts("OK");
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
if (!check(addr))
|
||
|
|
puts("ERR");
|
||
|
|
else if (!hash.count(addr))
|
||
|
|
puts("FAIL");
|
||
|
|
else
|
||
|
|
cout << hash[addr] << endl;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|