Submission #1141267

#TimeUsernameProblemLanguageResultExecution timeMemory
1141267youssefsobhyXOR (IZhO12_xor)C++20
100 / 100
226 ms86812 KiB
/* Author YoussefSobhy30 */ #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template<typename T> using multi_ordered_set = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>; #define ll long long int #define endl "\n" #define fastread() ios_base::sync_with_stdio(false);cin.tie(NULL); #define sz(x) (int)x.size() #define fr(i , begin , end) for (ll i = begin ; i < end ; i++) #define frr(i , begin , end) for (ll i = begin ; i >= end ; i--) #define all(ch) ch.begin() , ch.end() #define allr(ch) ch.rbegin() , ch.rend() #define ON(n , k) ( (n) | (1 << (k)) ) #define mem(arr) memset(arr , -1 , sizeof arr) #define kill(x) cout << x << endl ; #define OFF(n , k) ((n) & ~(1 << (k))) #define isON(n , k) (((n) >> k) & 1) #define RV(x) return void (cout << x << endl) ; const ll inf = 2e18; const ll MOD = 1e9 + 7; int dx[] = {1, 0, -1, 0, -1, -1, 1, 1}; int dy[] = {0, -1, 0, 1, -1, 1, -1, 1}; char di[] = {'D', 'L', 'U', 'R'}; ll add(const ll &a, const ll &b) { return (a + b + 2 * MOD) % MOD; } ll mul(const ll &a, const ll &b) { return (a % MOD + MOD) * (b % MOD + MOD) % MOD; } ll sub(const ll a, const ll b) { return (a % MOD - b % MOD + 2 * MOD) % MOD; } ll gcd(ll a, ll b) { if (!b) return a; return gcd(b, a % b); } ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); } const ll N = 5e5 + 10, LOG = 30; struct Node { Node *childs[2]; ll size[2]; ll Min_index ; Node() { childs[0] = childs[1] = nullptr; size[0] = size[1] = 0; Min_index = inf ; } }; struct BinaryTrie { Node *root = new Node(); void insert(ll x , ll index) { Node *cur = root; for (ll i = 30; i >= 0; i--) { cur->Min_index = min(cur->Min_index , index) ; bool idx = x & (1LL << i); if (cur->childs[idx] == nullptr) cur->childs[idx] = new Node(); cur->size[idx]++; cur = cur->childs[idx]; } cur->Min_index = min(cur->Min_index , index) ; } ll Query(ll n , Node *cur , ll ans , ll i , ll x) { if (ans >= x) return cur->Min_index; if (i == -1) return inf ; ll res = inf ; if (n & (1LL << i)) { if (cur->childs[0] != nullptr) res = min(res , Query(n , cur->childs[0] , (ans | (1LL << i)) , i - 1 , x)); else res = min(res , Query(n , cur->childs[1] , ans , i - 1 , x)); } else { if (cur->childs[1] != nullptr) res = min(res , Query(n , cur->childs[1] , (ans | (1LL << i)) , i - 1 , x)); else res = min(res , Query(n , cur->childs[0] , ans , i - 1 , x)); } return res; } }; void solve() { ll n , x ; cin >> n >> x; vector<ll> a(n); for (ll i = 0 ; i < n ; i++) cin >> a[i]; BinaryTrie trie ; trie.insert(0 , 0); ll index = 0 , size = 0 , cur = 0 ; for (ll i = 0 ; i < n ; i++) { cur ^= a[i]; ll ans = trie.Query(cur , trie.root , 0 , 30 , x); trie.insert(cur, i + 1); if (i - ans + 1 > size) size = i - ans + 1 , index = ans + 1 ; if (i - ans + 1 == size) index = min(ans + 1, index) ; } cout << index << " " << size << endl ; } //! CHECK LONG LONG int main() { fastread() ll Test = 1; // cin >> Test; for (int _ = 1; _ <= Test; _++) { cout << fixed << showpoint << setprecision(10); // cout << "Case #" << _ << ": " ; solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...