Submission #1182641

#TimeUsernameProblemLanguageResultExecution timeMemory
1182641hrkXOR (IZhO12_xor)C++17
100 / 100
253 ms88620 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define f(i,x,y) for(int i=x;i<y;i++)
#define f2(i,x,y) for(int i=x;i>=y;i--)
#define pii pair<int,int>
#define Fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
const int MOD =1000000007;
const int INF = 1e18;
const int N = 2e5;
struct BinaryTrie {
private:
    int B;
    struct node
    {
        int numbercount;
        node *next[2];
        int count;
        int index;
        node() {
            count = 0;
            index = INF;
            numbercount = 0;
            for (int i = 0; i < 2; i++)
                next[i] = NULL;
        }
    };
    node *root;
public:
    BinaryTrie(int b) {
        B = b;
        root = new node();
    }
    void insert(int x,int ind) {
        node* curr = root;
        curr -> count++;
        for (int i = B ; i >= 0; i--) {
            int b = x >> i & 1;
            if (curr -> next[b] == NULL) curr -> next[b] = new node();
            curr = curr -> next[b];
            curr -> count++;
            curr -> index = min(curr->index,ind);
        }
        curr->numbercount++;
    }
    void del(int x) {
        node* curr = root;
        curr -> count++;
        for (int i = B ; i >= 0; i--) {
            int b = x >> i & 1;
            if (curr -> next[b] == NULL)return;
            curr = curr -> next[b];
            curr -> count--;
        }
        curr->numbercount--;
    }
    bool search(int x) { //find if s exist
        node *curr = root;
        for (int i = B ; i >= 0; i--) {
            int b = x >> i & 1;
            if (curr->next[b] == NULL)
                return false;
            curr = curr->next[b];
        }
        return curr->numbercount > 0;
    }
    int getXorMax(int x) { // returns max ai xor s(in decimal)
        int ans = 0;
        node *curr = root;
        for (int i = B ; i >= 0; i--) {
            int b = x >> i & 1;
            if (curr->next[!b] == NULL or curr->next[!b]->count == 0) {
                curr = curr->next[b];
            }
            else {
                curr = curr->next[!b];
                ans += 1ll << i;
            }
        }
        return ans;
    }
    int getXorMin(int x) { // returns min ai xor s(in decimal)
        int ans = 0;
        node *curr = root;
        for (int i = B ; i >= 0; i--) {
            int b = x >> i & 1;
            if (curr->next[b] == NULL or curr->next[b]->count == 0) {
                curr = curr->next[!b];
                ans += 1ll << i;
            }
            else {
                curr = curr->next[b];
            }
        }
        return ans;
    }
    int query(int x, int k) { // numbers of values val ^ x < k
        int ans = 0;
        node *curr = root;
        for (int i = B ; i >= 0; i--) {
            if (curr == NULL)break;
            int b1 = x >> i & 1 , b2 = k >> i & 1;
            if (b2 == 1) {
                if (curr->next[b1])
                    ans += curr->next[b1]->count;
                curr = curr->next[!b1];
            }
            else curr = curr->next[b1];
        }
        return ans;
    }
    pii query(int x){
        node *curr = root; int ans = 0;
        for(int i=B;i>=0;i--){
            int bit = x >> i & 1;
            if(curr -> next[!bit]){
                ans += (1ll<<i);
                curr = curr->next[!bit];
            }
            else curr = curr->next[bit];
        }
        return make_pair(ans,curr->index);
    }
};
void solve(int tc){
    int n,x; cin >> n >> x;
    vector<int>v(n+1),pref(n+1);
    for(int i=1;i<=n;i++) cin >> v[i];
    for(int i=1;i<=n;i++) pref[i] = pref[i-1] ^ v[i];
    BinaryTrie T(32);
    T.insert(0,0);
    int mxlen = 0,j=n+1;
    for(int i=1;i<=n;i++){
        pii a = T.query(pref[i]);
        a.ss++;
        if(a.ff >= x){
            if(i-a.ss+1 > mxlen){
                mxlen = i-a.ss+1;
                j = a.ss;
            }
            else if(i-a.ss+1 == mxlen){
                j = min(j,a.ss);
            }
        }
        T.insert(pref[i],i);
    }
    cout << j << " " << mxlen << endl;
}
int32_t main(){

    Fast

    int t=1;

    // cin >> t;

    for(int tc=1;tc<=t;tc++){

        solve(tc);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...