求助:90分,#12,#18RE了
查看原帖
求助:90分,#12,#18RE了
377751
Scapegoat_Tree楼主2021/10/25 18:23

RT

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct Node
{
	ll ad, id;
}ser[1010],serf[1010],cli[1010];
ll n,cnt1,cnt2,cnt3;
string ans[1010];
bool cmp(Node a, Node b)
{
	if (a.ad == b.ad) return a.id < b.id;
	return a.ad < b.ad;
}
ll sol (ll x)
{
	if (x / 10 == 0) return 1;
	if (x / 100 == 0) return 2;
	if (x / 1000 == 0) return 3;
	if (x / 10000 == 0) return 4;
	if (x / 100000 == 0) return 5;
	return 1000;
}
ll work (ll a, ll b, ll c, ll d, ll e)
{
	ll an = 1;
	for (ll i = 1; i <= 3; ++i)
		an *= 10;
	an += a;
	for (ll i = 1; i <= 3; ++i)
		an *= 10;
	an += b;
	for (ll i = 1; i <= 3; ++i)
		an *= 10;
	an += c;
	for (ll i = 1; i <= 3; ++i)
		an *= 10;
	an += d;
	for (ll i = 1; i <= 5; ++i)
		an *= 10;
	an += e;
	return an;
}
ll find(ll ad)
{
	ll l = 1, r = cnt3;
	while (l < r)
	{
		ll mid = (l + r) >> 1;
		if (serf[mid].ad < ad) l = mid + 1;
		else r = mid;
		
	}
	if (serf[l].ad == ad)
		return serf[l].id;
	else return -1;
}
string sol1(ll x)
{
	ll len = sol(x);
	string an1 = "",an2 = "";
	for (ll i = 1; i <= len; ++i)
	{
		an1 += char(x % 10 + '0');
		x /= 10;
	}
	for (ll i = len - 1; i >= 0; --i)
		an2 += an1[i];
	return an2;
}
int main ()
{
	ios::sync_with_stdio(false);
	cin >> n;
	
	for (ll i = 1; i <= n; ++i)
	{
		string op, s;
		cin >> op >> s;
		if (op == "Server")
		{
			ll len = s.size(),cnt11 = 0,cnt22 = 0;
			for (ll j = 0; j < len; ++j)
				if (s[j] == '.') cnt11 ++;
				else if (s[j] == ':') cnt22 ++;
			if (cnt11 != 3 || cnt22 != 1)
			{
				ans[i] = "ERR";
				continue;
			}
			ll xb = 0, a = 0, b = 0, c = 0, d = 0, e = 0, lst = 0;
			while (s[xb] != '.')
				a = a * 10 + s[xb] - '0', ++xb;
			if (sol (a) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (s[xb] != '.')
				b = b * 10 + s[xb] - '0', ++xb;
			if (sol (b) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (s[xb] != '.')
				c = c * 10 + s[xb] - '0', ++xb;
			if (sol (c) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (s[xb] != ':')
				d = d * 10 + s[xb] - '0', ++xb;
			if (sol (d) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (xb < len)
				e = e * 10 + s[xb] - '0', ++xb;
			if (sol (e) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			if(a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255 || e < 0 || e > 65535)
			{
				ans[i] = "ERR";
				continue;
			}
			ser[++cnt1].ad = work (a, b, c, d, e);
			ser[cnt1].id = i;
//			cout << ser[cnt1].ad << endl;
		}else
		{
			ll len = s.size(),cnt11 = 0,cnt22 = 0;
			for (ll j = 0; j < len; ++j)
				if (s[j] == '.') cnt11 ++;
				else if (s[j] == ':') cnt22 ++;
			if (cnt11 != 3 || cnt22 != 1)
			{
				ans[i] = "ERR";
				continue;
			}
			ll xb = 0, a = 0, b = 0, c = 0, d = 0, e = 0, lst = 0;
			while (s[xb] != '.')
				a = a * 10 + s[xb] - '0', ++xb;
			if (sol (a) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (s[xb] != '.')
				b = b * 10 + s[xb] - '0', ++xb;
			if (sol (b) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (s[xb] != '.')
				c = c * 10 + s[xb] - '0', ++xb;
			if (sol (c) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (s[xb] != ':')
				d = d * 10 + s[xb] - '0', ++xb;
			if (sol (d) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			++xb;
			lst = xb;
			while (xb < len)
				e = e * 10 + s[xb] - '0', ++xb;
			if (sol (e) != xb - lst) 
			{
				ans[i] = "ERR";
				continue;
			}
			if(a < 0 || a > 255 || b < 0 || b > 255 || c < 0 || c > 255 || d < 0 || d > 255 || e < 0 || e > 65535)
			{
				ans[i] = "ERR";
				continue;
			}
			cli[++cnt2].ad = work (a, b, c, d, e);
			cli[cnt2].id = i;
		}
	}
	sort(ser + 1, ser + 1 + cnt1, cmp);
	serf[++cnt3] = ser[1], ans[ser[1].id] = "OK";

	for (ll i = 2; i <= cnt1; ++i)
		if (ser[i].ad != ser[i - 1].ad) serf[++cnt3] = ser[i], ans[ser[i].id] = "OK";
		else ans[ser[i].id] = "FAIL";
	for (ll i = 1; i <= cnt2; ++i)
	{
		ll an = find(cli[i].ad);
		if (an == -1 || an > cli[i].id) ans[cli[i].id] = "FAIL";
		else ans[cli[i].id] = sol1(an);
	}
	for (ll i = 1; i <= n; ++i)
		cout << ans[i] << endl;
	return 0;
}
2021/10/25 18:23
加载中...