2021杭電多校賽第一場
阿新 • • 發佈:2021-07-30
Xor sum
#include <bits/stdc++.h> using namespace std; class Trie { private: static const int MAXN = 1e5 + 5; static const int BASE = 30; int idx = 1, trie[MAXN * BASE][2]; int pos[MAXN * BASE]; // pos[i]: 異或字首為i的最右端點 public: void insert(int p, int x) { int u = 1; for (int i = BASE; i >= 0; --i) { int v = (x >> i) & 1; if (!trie[u][v]) trie[u][v] = ++idx; u = trie[u][v]; pos[u] = max(pos[u], p); } } int find(int x, int k) { int u = 1, res = -1; for (int i = BASE; i >= 0; --i) { int v = (x >> i) & 1; if ((k >> i) & 1) { // 如果k當前位為1 // 只有當前位x能找和它異或為1的數才有可能大於等於k // 否則直接返回已經找到的最大值 if (trie[u][v ^ 1]) u = trie[u][v ^ 1]; else return res; } else { // 如果k當前位為0, x異或後當前位是0是1都有可能大於等於k // 如果異或後是1, 那肯定大於等於k了, 不用往下再遍歷了, 直接嘗試更新最大值 // 否則繼續往下遍歷 if (trie[u][v ^ 1]) res = max(res, pos[trie[u][v ^ 1]]); u = trie[u][v]; } } res = max(res, pos[u]); // 到達最底層即==k的情況 return res; } void clear() { for (int i = 1; i <= idx; ++i) { pos[i] = 0; trie[i][0] = trie[i][1] = 0; } idx = 1; } } tree; const int MAXN = 1e5 + 5; int a[MAXN]; int main(int argc, char *argv[]) { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; cin >> T; while (T--) { tree.clear(); int n, k; cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> a[i]; a[i] ^= a[i - 1]; } int L = -1, R = n + 1; for (int r = 1; r <= n; ++r) { tree.insert(r, a[r]); int l = tree.find(a[r], k); if (~l && r - l < R - L) { L = l, R = r; } } if (L == -1) cout << -1 << '\n'; else cout << L + 1 << ' ' << R << '\n'; } system("pause"); return 0; }