Submission #1307809

#TimeUsernameProblemLanguageResultExecution timeMemory
1307809mosaabXOR (IZhO12_xor)C++17
100 / 100
171 ms84656 KiB
// عَجَبًا لأَمْرِ المُؤْمِنِ، إنَّ أمْرَهُ كُلَّهُ خَيْرٌ
#include <iostream>
using namespace std;
using ll = long long;
const char el = '\n';

struct Trie {
    Trie *p[2]{};
    int mn{1000000000}, lz{}, i{};

    void prp() {
        if (lz >> i & 1)
            swap(p[0], p[1]);
        if (p[0]) p[0]->lz ^= lz;
        if (p[1]) p[1]->lz ^= lz;
        lz = 0;
    }

    void insert(int x, int idx) {
        prp();
        mn = min(mn, idx);
        if (i == -1) return;
        if (x >> i & 1) {
            if (!p[1]) p[1] = new Trie(), p[1]->i = i - 1;
            p[1]->insert(x, idx);
        } else {
            if (!p[0]) p[0] = new Trie(), p[0]->i = i - 1;
            p[0]->insert(x, idx);
        }
    }

    int query(int l) {
        prp();
        if (i == -1) return mn;
        int ans = 1000000000;
        if (l >> i & 1)
            return p[1] ? p[1]->query(l) : ans;
        if (p[1]) ans = min(ans, p[1]->mn);
        if (p[0]) ans = min(ans, p[0]->query(l));
        return ans;
    }
};

void unsolve() {
    int n, x;
    cin >> n >> x;
    Trie s;
    s.i = 30;
    s.insert(0, 0);
    int len = 0, idx = 1;
    for (int i = 1, v, xr = 0; i <= n; i++) {
        cin >> v;
        xr ^= v;
        s.insert(xr, i);
        s.lz ^= xr;
        int q = s.query(x);
        s.lz ^= xr;
        if (i - q > len) {
            len = i - q;
            idx = q + 1;
        }
    }
    cout << idx << ' ' << len;
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
#if Mosaab
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int t = 1;
    // cin >> t;
    while (t--) unsolve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...