F. 十六进制的异或

原题链接

题解

1.异或规则为不进位加法,可以看作位运算
2.查找的时间复杂度必不能高,log161018·2e5
2.所以,补齐前缀0,这样就能用字典树了

code

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

// Trie数组的定义,大小为2000005*16,适应十六进制字符(0-15)
int trie[2000005][16] = {0}; 
// id数组,大小与trie数组一致,用于存储每个字符串对应的索引
int id[2000005] = {0}; 
int cnt = 0; // 节点计数器

int main() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> s;
        int len = s.size();
        // 补零操作,确保字符串长度为20
        for (int j = 1; j <= 20 - len; j++) s = '0' + s; 
        int now = 0;
        for (int k = 0; s[k]; k++) {
            int d;
            // 将字符转换为对应的十六进制数值
            if (isdigit(s[k])) d = s[k] - '0';
            else d = s[k] - 'A' + 10;

            // 如果当前节点没有对应的子节点,则创建一个新节点
            if (!trie[now][d]) trie[now][d] = ++cnt;
            // 移动到下一个节点
            now = trie[now][d];
        }
        // 在最后一个节点存储字符串的索引
        id[now] = i; 
    }

    while (q--) {
        ll x;
        cin >> x;
        string s;
        // 将十进制数转换为十六进制字符串
        while (x) {
            int d = x % 16;
            char c;
            if (d < 10) c = d + '0';
            else c = d - 10 + 'A';
            // 注意这里是c + s,确保高位在前
            s = c + s; 
            x /= 16;
        }
        int len = s.size();
        // 补零操作,确保字符串长度为20
        for (int j = 1; j <= 20 - len; j++) s = '0' + s;

        int now = 0;
        for (int k = 0; s[k]; k++) {
            int d;
            // 将字符转换为对应的十六进制数值
            if (isdigit(s[k])) d = s[k] - '0';
            else d = s[k] - 'A' + 10;

            bool found = false; // 标志位,判断是否找到匹配节点
            for (int j = 15; j >= 0; j--) {
                // 寻找匹配节点,循环从15到0,处理十六进制字符
                int next = (j - d + 16) % 16;
                if (trie[now][next]) {
                    now = trie[now][next];
                    found = true;
                    break;
                }
            }
            if (!found) { // 如果没有找到匹配节点,则设置now为0并跳出循环
                now = 0;
                break;
            }
        }
        // 输出找到的字符串的索引,如果没有找到,输出0
        cout << id[now] << endl; 
    }
    return 0;
}

posted @   纯粹的  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示