1 条题解

  • 0
    @ 2026-3-16 20:38:51

    别喷我,燃尽了,90分。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const int BITS = 24;  // 2^24 > 10^7
    
    struct Node {
        int son[2];
        int max_id;
        Node() {
            son[0] = son[1] = 0;
            max_id = -1;
        }
    };
    
    vector<Node> tr;
    vector<int> root;
    vector<int> s;
    int n, m;
    
    int new_node() {
        tr.push_back(Node());
        return tr.size() - 1;
    }
    
    // 非递归插入,避免递归爆栈
    void insert(int idx, int k, int p, int q) {
        int cur_p = p, cur_q = q;
        vector<int> path;
        path.push_back(q);
        
        for (int i = k; i >= 0; i--) {
            int v = (s[idx] >> i) & 1;
            // 复制另一个分支
            tr[cur_q].son[v ^ 1] = tr[cur_p].son[v ^ 1];
            // 创建新分支节点
            tr[cur_q].son[v] = new_node();
            // 记录路径
            path.push_back(tr[cur_q].son[v]);
            // 移动到下一层
            cur_p = tr[cur_p].son[v];
            cur_q = tr[cur_q].son[v];
        }
        // 设置叶子节点的max_id
        tr[cur_q].max_id = idx;
        // 回溯更新路径上节点的max_id
        for (int i = path.size() - 2; i >= 0; i--) {
            int node = path[i];
            int left = tr[node].son[0];
            int right = tr[node].son[1];
            int max_left = (left == 0) ? -1 : tr[left].max_id;
            int max_right = (right == 0) ? -1 : tr[right].max_id;
            tr[node].max_id = max(max_left, max_right);
        }
    }
    
    int query(int root_idx, int C, int L) {
        int p = root_idx;
        for (int i = BITS - 1; i >= 0; i--) {
            int v = (C >> i) & 1;
            int best = tr[p].son[v ^ 1];
            if (best != 0 && tr[best].max_id >= L) {
                p = best;
            } else {
                p = tr[p].son[v];
                if (p == 0) break;  // 防止访问空节点
            }
        }
        return C ^ s[tr[p].max_id];
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        
        cin >> n >> m;
        s.resize(n + m + 5);
        root.resize(n + m + 5);
        
        for (int i = 1; i <= n; i++) {
            cin >> s[i];
            s[i] ^= s[i - 1];
        }
        
        // 初始化Trie
        tr.reserve((n + m) * 25 + 5);  // 预分配空间
        new_node();  // 创建0号空节点
        root[0] = new_node();
        insert(0, BITS - 1, 0, root[0]);
        
        for (int i = 1; i <= n; i++) {
            root[i] = new_node();
            insert(i, BITS - 1, root[i - 1], root[i]);
        }
        
        char op;
        int l, r, x;
        int now = n;
        
        for (int i = 0; i < m; i++) {
            cin >> op;
            if (op == 'A') {
                cin >> x;
                now++;
                s[now] = s[now - 1] ^ x;
                root[now] = new_node();
                insert(now, BITS - 1, root[now - 1], root[now]);
            } else {
                cin >> l >> r >> x;
                int C = s[now] ^ x;
                cout << query(root[r - 1], C, l - 1) << "\n";
            }
        }
        
        return 0;
    }
    

    信息

    ID
    167
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    15
    已通过
    0
    上传者