Submission #1146779

#TimeUsernameProblemLanguageResultExecution timeMemory
1146779halzoomXOR (IZhO12_xor)C++20
100 / 100
123 ms66212 KiB
#include <bits/stdc++.h> //#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") using namespace std; #define ll long long #define int long long #define double long double void UwU() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); } //void fileIO() { //#ifndef ONLINE_JUDGE // freopen("Input.txt", "r", stdin); // freopen("Output.txt", "w", stdout); //#endif //} const ll N = 1e5 + 5; const ll MOD = 1000000007; const ll mod = 998244353; const ll inf = 1e18; const double EPS = 1e-4; struct Trie { private: struct Node { int child[2]{}; int cnt = 0, minIDX = inf; int &operator[](int x) { return child[x]; } }; vector<Node> node; public: Trie() { node.emplace_back(); } int newNode() { node.emplace_back(); return node.size() - 1; } int sz(int x) { return node[x].cnt; } int M = 30; void update(int x, int op, int idx) { int cur = 0; for (int i = M - 1; i >= 0; --i) { int c = x >> i & 1; if (node[cur][c] == 0) { node[cur][c] = newNode(); } cur = node[cur][c]; node[cur].cnt += op; node[cur].minIDX = min(idx, node[cur].minIDX); } } int query(int t, int x) { int cur = 0, res = inf, ret = inf; for (int i = M - 1; i >= 0; --i) { int ct = (t >> i) & 1; int cx = (x >> i) & 1; if (sz(sz(node[cur][ct ^ cx])) == 0) { res = inf; break; } if (cx == 0 and sz(node[cur][!ct])) { ret = min(ret, node[node[cur][!ct]].minIDX); } cur = node[cur][ct ^ cx]; res = node[cur].minIDX; } return min(ret, res); } }; void solve() { int n, X; cin >> n >> X; Trie trie; trie.update(0, 1, 0); int prefix = 0; int l = 0, k = 0; for (int i = 1, t; i <= n; ++i) { cin >> t; prefix ^= t; int x = trie.query(prefix, X); if (i - x > k) { k = i - x; l = x + 1; } trie.update(prefix, 1, i); } cout << l << ' ' << k; } // BEFORE coding are you sure you understood the statement correctly? // PLEASE do not forget to read the sample explanation carefully. // WATCH out for overflows & RTs in general. // TEST your idea or code on the corner cases. // ANALYZE each idea you have thoroughly. signed main() { UwU(); // fileIO(); int test = 1; // cin >> test; for (int i = 1; i <= test; ++i) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...