题解 | 特工身份识别系统(掩码)
特工身份识别系统
https://www.nowcoder.com/practice/f591698ed62a40cf92500abfb6b0b231
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdint>
bool is_authorized(const std::pair<uint64_t, uint32_t>& rule, const uint64_t code) {
if (rule.second == 0) return true;
const uint64_t mask = (rule.second == 48) ? 0xFFFFFFFFFFFFULL : ((1ULL << rule.second) - 1) << (48 - rule.second);
return (rule.first & mask) == (code & mask);
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n; // 授权规则个数
std::cin >> n;
std::cin.ignore();
std::vector<std::pair<uint64_t, uint32_t>> rules; // 授权规则(处理后的)
rules.reserve(n);
// 输入授权规则
for (int i = 0; i < n; ++i) {
// 读取授权规则并处理
std::string code_string_raw, code_string, m_string;
std::getline(std::cin, code_string_raw, '/');
std::getline(std::cin, m_string);
code_string.reserve(12);
std::copy_if(code_string_raw.begin(), code_string_raw.end(),
std::back_inserter(code_string), [](const char c) { return c != '-'; });
// 进制转换
rules.emplace_back(std::stoll(code_string, nullptr, 16), std::stoi(m_string));
}
int m; // 身份代号个数
std::cin >> m;
std::cin.ignore();
// 身份验证
for (int i = 0; i < m; ++i) {
// 输入身份代号并处理
std::string code_string_raw, code_string;
std::getline(std::cin, code_string_raw);
code_string.reserve(12);
std::copy_if(code_string_raw.begin(), code_string_raw.end(),
std::back_inserter(code_string), [](const char c) { return c != '-'; });
// 进制转换
const uint64_t code = std::stoll(code_string, nullptr, 16);
// 身份验证
bool authorized = false;
for (const auto& rule : rules) {
if (is_authorized(rule, code)) {
authorized = true;
break;
}
}
std::cout << (authorized ? "YES" : "NO") << std::endl;
}
return 0;
}