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;
}