CSP歷年複賽題-P7911 [CSP-J 2021] 網路連線

五月江城發表於2024-06-18

原題連結:https://www.luogu.com.cn/problem/P7911

題意解讀:伺服器server建立連線,客戶端client加入連線,建立和加入連線都要指定一個ip地址,對已經建立過連線的ip地址再次建立連線會失敗,加入連線沒有限制,根據要求進行輸出。

解題思路:

此題有兩個關鍵點:

1、驗證IP地址的格式是符合規範的,不合規範要輸出ERR

CSP歷年複賽題-P7911 [CSP-J 2021] 網路連線

2、建立連線時,用map儲存已經建立連線的IP地址,用於判斷是否存在,如果不存在則建立連線成功並加IP地址和編號加入map,如果存在則FAIL

3、加入連線時,判斷IP是否在map中存在,如果存在則輸出IP對應的編號,如果不存在則FAIL

100分程式碼:

#include <bits/stdc++.h>
using namespace std;

int n;
string type, ip;
map<string, int> h;

bool check(string ip)
{
    vector<int> dot; //點號的位置
    vector<int> mao; //冒號的位置
    for(int i = 0; i < ip.size(); i++)
    {
        if(ip[i] == '.') dot.push_back(i);
        if(ip[i] == ':') mao.push_back(i);
    }
    if(dot.size() != 3 || mao.size() != 1) return false;

    //判斷a
    int a = 0;
    int l = 0, r = dot[0];
    if(r - l <= 0 || r - l > 3) return false; //a長度不對
    if(ip[l] == '0' && r - l > 1) return false; //a有前導0
    for(int i = l; i < r; i++) 
    {
        if(ip[i] < '0' || ip[i] > '9') return false; //a有非數字字元
        a = 10 * a + ip[i] - '0';
    }
    if(a < 0 || a > 255) return false; //a範圍不對

    //判斷b
    int b = 0;
    l = dot[0] + 1, r = dot[1];
    if(r - l <= 0 || r - l > 3) return false; //b長度不對
    if(ip[l] == '0' && r - l > 1) return false; //b有前導0
    for(int i = l; i < r; i++) 
    {
        if(ip[i] < '0' || ip[i] > '9') return false; //b有非數字字元
        b = 10 * b + ip[i] - '0';
    }
    if(b < 0 || b > 255) return false; //b範圍不對

    //判斷c
    int c = 0;
    l = dot[1] + 1, r = dot[2];
    if(r - l <= 0 || r - l > 3) return false; //c長度不對
    if(ip[l] == '0' && r - l > 1) return false; //c長度為0或者有前導0
    for(int i = l; i < r; i++) 
    {
        if(ip[i] < '0' || ip[i] > '9') return false; //c有非數字字元
        c = 10 * c + ip[i] - '0';
    }
    if(c < 0 || c > 255) return false; //c範圍不對

    //判斷d
    int d = 0;
    l = dot[2] + 1, r = mao[0];
    if(r - l <= 0 || r - l > 3) return false; //d長度不對
    if(ip[l] == '0' && r - l > 1) return false; //d有前導0
    for(int i = l; i < r; i++) 
    {
        if(ip[i] < '0' || ip[i] > '9') return false; //d有非數字字元
        d = 10 * d + ip[i] - '0';
    }
    if(d < 0 || d > 255) return false; //b範圍不對

    //判斷e
    int e = 0;
    l = mao[0] + 1, r = ip.size();
    if(r - l <= 0 || r - l > 5) return false; //e長度不對
    if(ip[l] == '0' && r - l > 1) return false; //e有前導0
    for(int i = l; i < r; i++) 
    {
        if(ip[i] < '0' || ip[i] > '9') return false; //e有非數字字元
        e = 10 * e + ip[i] - '0';
    }
    if(e < 0 || e > 65535) return false; //e範圍不對
    
    return true;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> type >> ip;
        if(!check(ip)) cout << "ERR" << endl;
        else
        {
            if(type == "Server")
            {
                if(h[ip]) cout << "FAIL" << endl;
                else
                {
                    h[ip] = i;
                    cout << "OK" << endl;
                } 
            }
            else if(type == "Client") 
            {
                if(h[ip]) cout << h[ip] << endl;
                else cout << "FAIL" << endl;
            }
        }
    }
    return 0;
}

相關文章