我就无语了,95分,第10个测试点WA......
查看原帖
我就无语了,95分,第10个测试点WA......
453449
YunMengQWQ楼主2021/12/26 10:09

代码如下:

#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分我服了

2021/12/26 10:09
加载中...