57 lines
2.1 KiB
C++
57 lines
2.1 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
|
||
int w[5];
|
||
bool check(string ip) {
|
||
int t[6] = {0, -1, -1, -1, -1, -1}; // 用来把ip里的数字读出
|
||
int cnt = sscanf(ip.c_str(), "%d.%d.%d.%d:%d", &t[1], &t[2], &t[3], &t[4], &t[5]); // cnt存ip里有多少个数据
|
||
// 好了,后(划掉)先进的sscanf来啦~
|
||
// ip.c_str() 比较先进的东东,把ip转换为char类型
|
||
//"%d.%d.%d.%d:%d" 跳过.和:,把数据读出
|
||
//&t[1],&t[2],&t[3],&t[4],&t[5] 把读出的数据填到t数组里
|
||
if (cnt != 5)
|
||
return false; // 如果cnt不等于5,说明数据个数不对,返回不合法
|
||
for (int i = 1; i <= 4; i++) { // 判断数据有没有超过上限
|
||
if (t[i] < 0 || t[i] > 255)
|
||
return false;
|
||
}
|
||
if (t[5] < 0 || t[5] > 65535)
|
||
return false; // 判断数据有没有超过上限
|
||
char now[60]; // 用来把数字读回,从而卡掉前导0和符号错误
|
||
sprintf(now, "%d.%d.%d.%d:%d", t[1], t[2], t[3], t[4], t[5]); // 又是一个先进的东东
|
||
// 和前面差不多
|
||
// now 前面那个用来把数字读回,从而卡掉前导0和符号错误的数组
|
||
//"%d.%d.%d.%d:%d" 和sscanf效果差不多,只是把数据读回
|
||
// t[1],t[2],t[3],t[4],t[5] 和sscanf效果差不多,依次填入%d里
|
||
if (now != ip)
|
||
return false; // 如果now不等于原来的ip,说明有前导0或符号错误,返回不合法
|
||
return true; // 这组数据经过了重重考验,留了下来,返回合法
|
||
}
|
||
|
||
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;
|
||
} |