可能代码写的有一点重复,算了不管了,先交一发题解。

首先,这一道题是一个简单模拟,比较重要的部分就是怎么判断这个地址是否合法,然后就是怎么将用户和服务器进行匹配。

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去掉数字(即abcde),也只剩下了...:

如果剩下的不是...:,就直接丢进垃圾桶里面判为非法。

if (s1 != "...:") {
	legal = false;
	return ;
}

1.2 数字

接着,我们用一个数组bitbit来存储每一位,第ii位就是biti1bit_{i-1}

Q:为什么你没有用a,b,c,d,ea,b,c,d,e呢?

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>头文件里,这样,一个数字串nn就成功地不等于0n\overline{0n}了。

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

op=op=Server的时候,判断地址是否被占用,若被占用,抛出一个FAIL,否则就将未被占用改为被占用,并记录当前的编号。

if (op == "Server") {
	if (address[ad].first == false)
		address[ad] = {true, i}, cout << "OK" << endl;
	else
		cout << "FAIL" << endl;
}

2.2 Client

op=op=Client的时候,map的作用便体现出来了,如果有一个对应的Server,直接输出,没有就直接抛出一个FAIL

if (op == "Client") {
	if (address[ad].first == true)
		cout << address[ad].second << endl;
	else
		cout << "FAIL" << endl;
}

Part 3 完整代码

AC Code{\color{#00D000}\text{AC}}\text{ Code}

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