Submission #1224740

#TimeUsernameProblemLanguageResultExecution timeMemory
1224740MuhammetXOR (IZhO12_xor)C++20
0 / 100
0 ms320 KiB
#include "bits/stdc++.h"

using namespace std;

#define ll long long
#define SZ(s) (int)s.size()
#define ff first
#define ss second

const int N = (3e5 + 5);
const int M = 1e9 + 7;

int v[N * 31][2], s[N * 31], ans, T, n, k;

void upd(int nd, int x, int y, int vl) {
    if(y == -1) {
        if(!s[nd]) s[nd] = vl;
        s[nd] = min(vl, s[nd]);
        return;
    }
    int t = (x >> y) & 1;
    if(!v[nd][t]) v[nd][t] = ++T;
    upd(v[nd][t], x, y-1, vl);
    s[nd] = min((!v[nd][0] ? n+1 : s[v[nd][0]]), (!v[nd][1] ? n+1 : s[v[nd][1]]));
}

void fnd(int nd, int x, int y) {
    if(y == -1) {
        ans = min(ans, s[nd]);
        return;
    }
    int t = (x >> y) & 1, tk = (k >> y) & 1;
    for(int i = 0; i < 2; i++) {
        if(i ^ t > tk and v[nd][i]) ans = min(ans, s[v[nd][i]]);
    }
    for(int i = 0; i < 2; i++) {
        if(i ^ t == tk and v[nd][i]) {
            fnd(v[nd][i], x, y-1);
            return;
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr);

    cin >> n >> k;
    vector <int> p(n+1, 0);
    int mx = 0, l = 0;
    for(int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        p[i] = p[i-1] ^ x;
        upd(0, p[i-1], 30, i);
        ans = n+1;
        fnd(0, p[i], 30);
        if(ans <= i and i - ans + 1 > mx) {
            l = ans;
            mx = i - l + 1;
        }
    }

    cout << l << ' ' << mx;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...