可能代码写的有一点重复,算了不管了,先交一发题解。
首先,这一道题是一个简单模拟,比较重要的部分就是怎么判断这个地址是否合法,然后就是怎么将用户和服务器进行匹配。
Part 1 判断合法
我们可以使用一个void
类型函数来看是否非法(当时我是这么写的,事后觉得可以直接用bool
)。
1.1 符号
格式已经告诉你,a.b.c.d:e
,那么我们在去掉所有的数字之后,肯定剩下的只有...:
,所以代码就好写了。
先新建一个空的字符串s1
,用来存放符号,只要不是数字,就直接往里面塞:
for (int i = 0; i < s.length(); i++) {
if (s[i] < '0' || s[i] > '9')
s1 += s[i];
}
那么,根据我们学习了多年的字符串可知,一个a.b.c.d:e
去掉数字(即a
,b
,c
,d
和e
),也只剩下了...:
。
如果剩下的不是...:
,就直接丢进垃圾桶里面判为非法。
if (s1 != "...:") {
legal = false;
return ;
}
1.2 数字
接着,我们用一个数组来存储每一位,第位就是。
Q:为什么你没有用呢?
A:我愿意。
for (int i = 0; i < s.length(); i++) {
if (s[i] == '.' || s[i] == ':')
cnt++;
if (s[i] >= '0' && s[i] <= '9')
bit[cnt] = 10 * bit[cnt] + (int)(s[i] - '0');
}
此时,我突然想起,好像还要判断前导0。于是,我就掏出了我珍藏已久的to_string
函数,它被放在了<string>
头文件里,这样,一个数字串就成功地不等于了。
s1 = to_string(bit[0]) + "." + to_string(bit[1]) + "." + to_string(bit[2]) + "." + to_string(bit[3]) + ":" + to_string(bit[4]);
if (s1 != s) {
legal = false;
return;
}
简单的判断是否越界:
for (int i = 0; i <= 3; i++)
if (bit[i] < 0 || bit[i] > 255) {
legal = false;
return;
}
if (bit[4] < 0 || bit[4] > 65535) {
legal = false;
return;
}
Part 2 配对
我们可以用map
来记录一个地址的信息,一共有两个,一是是否重复,二是其编号。
简单的map
里套pair
即可搞定。
map<string, pair<bool, int> > address;
2.1 Server
当Server
的时候,判断地址是否被占用,若被占用,抛出一个FAIL
,否则就将未被占用改为被占用,并记录当前的编号。
if (op == "Server") {
if (address[ad].first == false)
address[ad] = {true, i}, cout << "OK" << endl;
else
cout << "FAIL" << endl;
}
2.2 Client
当Client
的时候,map
的作用便体现出来了,如果有一个对应的Server
,直接输出,没有就直接抛出一个FAIL
。
if (op == "Client") {
if (address[ad].first == true)
cout << address[ad].second << endl;
else
cout << "FAIL" << endl;
}
Part 3 完整代码
:
#include <bits/stdc++.h>
using namespace std;
#define int long long
map<string, pair<bool, int> > address;
int N, bit[5];
bool legal;
string op, ad;
void convert(string s) {
legal = true;
string s1 = "";
int cnt = 0;
bit[0] = bit[1] = bit[2] = bit[3] = bit[4] = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] < '0' || s[i] > '9')
s1 += s[i];
}
if (s1 != "...:") {
legal = false;
return ;
}
for (int i = 0; i < s.length(); i++) {
if (s[i] == '.' || s[i] == ':')
cnt++;
if (s[i] >= '0' && s[i] <= '9')
bit[cnt] = 10 * bit[cnt] + (int)(s[i] - '0');
}
s1 = to_string(bit[0]) + "." + to_string(bit[1]) + "." + to_string(bit[2]) + "." + to_string(bit[3]) + ":" + to_string(bit[4]);
if (s1 != s) {
legal = false;
return;
}
for (int i = 0; i <= 3; i++)
if (bit[i] < 0 || bit[i] > 255) {
legal = false;
return;
}
if (bit[4] < 0 || bit[4] > 65535) {
legal = false;
return;
}
}
signed main() {
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> op >> ad;
convert(ad);
if (legal == false) {
cout << "ERR" << endl;
continue;
}
if (op == "Server") {
if (address[ad].first == false)
address[ad] = {true, i}, cout << "OK" << endl;
else
cout << "FAIL" << endl;
}
if (op == "Client") {
if (address[ad].first == true)
cout << address[ad].second << endl;
else
cout << "FAIL" << endl;
}
}
return 0;
}