代码如下:
#include <bits/stdc++.h>
using namespace std;
int len[1001];
char ad[1001][28], op[1001][10];
bool stcmp(int x1, int x2)
{
if (len[x1] != len[x2])
return false;
for (int i = 0; i < len[x1]; i++)
if (ad[x1][i] != ad[x2][i])
return false;
return true;
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> op[i] >> ad[i];
len[i] = strlen(ad[i]);
int fh = 1, flag = 0, last = -1, sum = 0;
for (int j = 0; j < len[i]; j++)
{
if (ad[i][j] == ':' || ad[i][j] == '.')
{
if (j != 0 && (ad[i][j - 1] == ':' || ad[i][j - 1] == '.')) //不能有连续符号
{
flag = 1;
break;
}
if (fh == 1 && j == 0) //第一个点号前不能没有数字
{
flag = 1;
break;
}
if (fh == 4 && j == len[i] - 1) //最后一个冒号后不能没有数字
{
flag = 1;
break;
}
if (fh == 4 && ad[i][j] != ':') //第四个符号不能不是冒号
{
flag = 1;
break;
}
if (fh < 4 && ad[i][j] != '.') //前三个符号不能不是点号
{
flag = 1;
break;
}
fh++;
last = j;
sum = 0;
}
else
{
sum = sum * 10 + ad[i][j] - '0'; //读取数字
if (ad[i][j + 1] == '.' || ad[i][j + 1] == ':' || j + 1 == len[i]) //如果数字读完了
{
if ((sum < 0 || sum > 255) && fh <= 4) //前四个数字
{
flag = 1;
break;
}
if ((sum < 0 || sum > 65535) && fh == 5) //冒号后面的数字
{
flag = 1;
break;
}
int wei = 0;
while (sum)
{
sum /= 10;
wei++;
}
if (sum == 0 && j - last == 1)
continue; //特判只有一个零
if (wei != j - last)
{
flag = 1;
break;
}
}
}
}
if (flag == 1 || fh != 5) //不能少符号,若flag=1,全输出ERR
{
cout << "ERR" << endl;
continue;
}
if (op[i][0] == 'S')
{
int flag1 = 0;
for (int j = 1; j < i - 1; j++)
{
if (op[j][0] == 'C')
continue;
if (stcmp(i, j)) //匹配上有相同服务器,输出FAIL
{
cout << "FAIL" << endl;
flag1 = 1;
break;
}
}
if (flag1 == 1)
continue;
else
cout << "OK" << endl; //新服务器输出OK
}
else
{
int flag2 = 0;
for (int j = 1; j <= i - 1; j++)
{
if (op[j][0] == 'C')
continue;
if (stcmp(i, j)) //匹配上服务器输出编号
{
flag2 = 2;
cout << j << endl;
break;
}
}
if (flag2 != 2)
{
cout << "FAIL" << endl;
}
}
}
return 0;
}
呃呃呃,95分我服了