Submission #1299183

#TimeUsernameProblemLanguageResultExecution timeMemory
1299183ahanfXOR (IZhO12_xor)C++20
100 / 100
365 ms88808 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; // Macros #define REP(i, j, n) for(int i = j; i < n; i++) #define trav(i, a) for(auto i: a) #define all(x) x.begin(), x.end() #define PB push_back #define EB emplace_back #define MP make_pair #define F first #define S second #define GCD __gcd #define DEBUG(i) cout << "DEBUG " << i << "\n"; #define CASE(i) cout << "Case " << i << ": "; #define MEM(arr, val) memset(arr, val, sizeof(arr)); // Type Names typedef unsigned long long ull; typedef long long ll; typedef vector<int> vi; typedef vector<long long> vll; typedef pair<int, int> pii; typedef pair<long long, long long> pll; typedef long double ld; typedef tree<int,null_type,less<int>,rb_tree_tag, tree_order_statistics_node_update> indexed_set; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset; // functions template <typename T> void pv(vector<T> &a){ for (auto elem: a){ cout << elem << " "; } cout << "\n"; } // Global Variables const ll MOD = 1e9 + 7; const ll mod = 998244353; const ll INF = 1e9 + 1; ll n, k; struct TrieNode { TrieNode *children[2]; TrieNode *parent; int mnidx; TrieNode(){ parent = nullptr; for (int i = 0; i < 2; i++){ children[i] = nullptr; } mnidx = n + 1; } }; void insert(TrieNode *root, ll x, int idx){ TrieNode *curr = root; string key = bitset<31>(x).to_string(); for (char c: key){ if (curr->children[c - '0'] == nullptr){ curr->children[c - '0'] = new TrieNode(); curr->children[c - '0']->parent = curr; } curr = curr->children[c - '0']; } curr->mnidx = min(curr->mnidx, idx); while (curr->parent != nullptr){ curr = curr->parent; curr->mnidx = min(curr->mnidx, idx); } } int query(TrieNode *root, ll x){ TrieNode *curr = root; string key = bitset<31>(x).to_string(); string tar = bitset<31>(k).to_string(); int ret = n + 10; for (int i = 0; i < 31; i++){ if (tar[i] == '1'){ if (curr->children[('1' - key[i])] == nullptr) break; curr = curr->children[('1' - key[i])]; } else { if (curr->children[('1' - key[i])] != nullptr) { ret = min(ret, curr->children[('1' - key[i])]->mnidx); } if (curr->children[key[i] - '0'] == nullptr) break; curr = curr->children[key[i] - '0']; } } return ret; } void solve(int tc){ cin >> n >> k; if (k == 0){ cout << 1 << " " << n << "\n"; return; } k--; vll a(n), pref(n + 1); REP(i, 0, n) cin >> a[i]; for (int i = 1; i <= n; i++){ pref[i] = (a[i - 1] ^ pref[i - 1]); } TrieNode *trie = new TrieNode(); int idx = 0, len = 0; insert(trie, pref[0], 0); for (int i = 1; i <= n; i++){ int res = query(trie, pref[i]); if (i - res > len){ idx = res + 1; len = i - res; } insert(trie, pref[i], i); } cout << idx << " " << len << "\n"; } int main() { cin.tie(NULL); ios_base::sync_with_stdio(false); // pre(); // freopen("inputf.in", "r", stdin); // freopen("outputf.out", "w", stdout); int i = 1; // int t = 1; // cin >> t; // for(i = 1; i <= t; i++) solve(i); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...