6.2总结

https://codeforces.com/gym/105184/attachments/download/25717/statement.pdf

I题

思路:

这段代码实现了一个简单的 IP 地址匹配器。它的主要功能是判断一个给定的 IP 地址是否匹配一个给定的子网掩码。下面是代码的思路:

1.split 函数:该函数用于分割字符串,将以特定字符为分隔符的子字符串存储到数组中。在这里,它用于将 IP 地址和子网掩码按照点号和斜杠分割成对应的部分。
2.bbs 函数:该函数将 IP 地址转换成二进制形式的 bitset。它首先调用 split 函数将 IP 地址按点号分割成四部分,然后将每个部分转换为整数,再将每个整数转换为对应的 8 位二进制数,最后将这 4 个 8 位二进制数组合成一个 32 位的 bitset。
3.judge 函数:该函数用于判断一个 IP 地址是否匹配一个子网掩码。它首先调用 split 函数将传入的子网掩码字符串按斜杠分割成 IP 地址和掩码位数两部分。然后,它调用 bbs 函数将 IP 地址和子网掩码都转换成对应的 bitset。接着,它比较前 pp 位是否相同,如果有不同的位,则返回 false,表示不匹配;如果所有位都相同,则返回 true,表示匹配。
4.main 函数:该函数首先读入一个整数 n,表示要判断的 IP 地址和子网掩码的组数。然后,它循环 n 次,每次读入一个 IP 地址和一个子网掩码,调用 judge 函数进行判断,并输出结果。

代码:

#include <iostream>
#include <bitset>
#include <string>
using namespace std;
void split(string& s, char dd, string* ts) {
    int tt = 0;
    int st = 0;
    for (size_t i = 0; i < s.size(); ++i) {
        if (s[i] == dd) {
            ts[tt++] = s.substr(st, i - st);
            st = i + 1;
        }
    }
    ts[tt] = s.substr(st, s.size() - st);
}
bitset<32> bbs(string& ip) {
    string ts[4];
    split(ip, '.', ts);
    bitset<32> bi;
    for (int i = 0; i < 4; ++i) {
        int ot = stoi(ts[i]);
        for (int j = 7; j >= 0; --j) {
            bi.set(i * 8 + (7 - j), (ot >> j) & 1);
        }
    }
    return bi;
}
bool judge(string& ss,string& ip) {
    string ts[2];
    split(ss, '/', ts);
    string si = ts[0];
    int pp = stoi(ts[1]);

    bitset<32> sbs = bbs(si);
    bitset<32> ibs = bbs(ip);

    for (int i = 0; i < pp; ++i) {
        if (sbs[i] != ibs[i]) {
            return false;
        }
    }
    return true;
}
int main() {
    string ss;
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        string ip;
        if (judge(ss, ip)) {
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值