Submission #1146851

#TimeUsernameProblemLanguageResultExecution timeMemory
1146851yasserXOR (IZhO12_xor)C++20
0 / 100
1 ms320 KiB
#include <bits/stdc++.h>
using namespace std;
void Yasser() {
    ios::sync_with_stdio(0);
    cin.tie(0);
}

struct Node {
    int childs[2] {} ;
    int pre ;
    int &operator[](int x) {
        return childs[x] ;
    }
};
struct Trie {
    vector<Node> trie ;
    int newNode () {
        trie.emplace_back() ;
        return trie.size() - 1 ;
    }
    void clear () {
        trie.clear() ;
    }
    Trie () {
        clear() ;
        newNode() ;
    }
    bool sz (int node) {
        return (trie[node].pre > 0) ;
    }
    void insertOrremove (int x , int op) {
        int node = 0 ;
        for(int i = 30 ; i >= 0 ; i--) {
            int bit = x >> i & 1 ;
            if(trie[node][bit] == 0) {
                trie[node][bit] = newNode() ;
            }
            node = trie[node][bit] ;
            trie[node].pre += op ;
        }
    }

    int Query (int x) {
        int res = 0 ;
        int node = 0 ;
        for(int i = 30 ; i >= 0 ; i--) {
            int bit = x >> i & 1 ;
            if(trie[node][1 - bit]) {
                if(1 - bit) res |= (1 << i) ;
                node = trie[node][1 - bit] ;
            }else {
                if(bit) res |= (1 << i) ;
                node = trie[node][bit] ;
            }
        }
        return res ;
    }

};
void solve() {
    int n , x ; cin >> n >> x ;
    map<int , vector<int>>idxs ;
    idxs[0].emplace_back(0) ;
    vector<int> arr(n + 1) ;
    for(int i = 1 ; i<= n ; i++) {
        cin >> arr[i] ;
        arr[i] ^= arr[i - 1] ;
        idxs[arr[i]].emplace_back(i) ;
    }
    Trie triee ;
    triee.insertOrremove(0 , +1) ;
    int mx = 0 , len = 0 ;
    int idx = 0 ;
    for(int i = 1 ; i<=n ; i++) {
        int x = triee.Query(arr[i]) ;
        if(x ^ arr[i] >= mx) {
            mx = x ^ arr[i] ;
            if(len < i - *idxs[x].begin()) {
                idx = *idxs[x].begin() ;
                len = i - *idxs[x].begin() ;
            }
        }
        triee.insertOrremove(arr[i] , +1) ;
    }
    cout << idx + 1<< ' ' << len << endl;
}

signed main() {

    int test_cases = 1;
    //cin >> test_cases;
    while(test_cases--) {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...