75分求助
查看原帖
75分求助
689146
mushezi楼主2022/8/14 18:04
#include <bits/stdc++.h>
using namespace std;

map<string, int> dict; // addr -> code
string host, addr;
int n, cnt = 1;

bool check_num(int num,int len,int lim){ // lim->1 : 255, lim->2 : 65535
    if(num == 0){
        if(len != 1) return 0;
        return 1;
    }
    if(lim == 1){
        if(num < 0 || num > 255)
            return 0;
    }
    else{
        if(num < 0 || num > 65535)
            return 0;
    }
    int l = 0;
    while(num){
        l++;
        num /= 10;
    }
    return len == l;
}

bool isright(string s){
    // 符号数量判断
    int cnt = 0;
    bool f = 0; // 看是否有冒号
    int pos[10]; // 记录点和冒号位置
    pos[0] = -1; // 开始用 -1
    for(int i = 0; i < s.size(); i++){
        if(s[i] == '.') pos[++cnt] = i;
        if(s[i] == ':'){
            pos[++cnt] = i;
            f = 1;
            break;
        }
    }
    if(!f || cnt != 4) return 0; 

    int num = 0;
    int len = 0;

    for(int i = 1; i <= 4; i++){
        num = 0;
        len = 0;
        for(int j=pos[i-1]+1;j<=pos[i]-1;j++) num = num * 10 + s[j]-'0';
        len = pos[i] - pos[i-1] - 1;
        if(!check_num(num, len, 1)) return 0;
    }

    num = 0;
    len = 0;

    for(int i = pos[4]+1; i <= s.size()-1; i++){
        num = num * 10 + s[i]-'0';
    }
    len = s.size()-1 - pos[4];

    if(!check_num(num, len, 2)) return 0;

    return 1;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    //freopen("network.in", "r", stdin);
    //freopen("network.out", "w", stdout);

    cin >> n;
    while(cnt <= n){
        cin >> host >> addr;
        if(host == "Server"){
            if(isright(addr)){
                if(!dict[addr]){
                    cout << "OK" << endl;
                    dict[addr] = cnt;
                }
                else cout << "FAIL" << endl;
            }
            else cout << "ERR" << endl;
        }
        else{
            if(isright(addr)){
                if(!dict[addr]) cout << "FAIL" << endl;
                else cout << dict[addr] << endl;
            }
            else cout << "ERR" << endl;
        }
        cnt++;
    }

    return 0;
}
2022/8/14 18:04
加载中...