1 条题解
-
0
别喷我,燃尽了,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; }
- 1
信息
- ID
- 167
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 15
- 已通过
- 0
- 上传者