제출 #1146666

#제출 시각아이디문제언어결과실행 시간메모리
1146666Braabebo10XOR (IZhO12_xor)C++20
100 / 100
122 ms68192 KiB
#include<bits/stdc++.h>
#define ll long long
#define nl "\n"
#define all(v) v.begin(),v.end()
#define baraa ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
const ll M = 32;

struct node {
    ll sz = 0, mp[2]{}, id = 3e5;
    ll &operator[](ll i) {
        return mp[i];
    }
};

struct Trie {
    vector<node> trie;
    ll create() {
        trie.emplace_back();
        return trie.size() - 1;
    }

    Trie() {
        trie.clear();
        create();
    }

    void insert(ll x, ll idx) {
        ll u = 0;
        bitset<32> bits = x;
        for (ll i = M - 1; i >= 0; i--) {
            if (!trie[u][bits[i]])
                trie[u][bits[i]] = create();
            u = trie[u][bits[i]];
            trie[u].sz++;
            trie[u].id = min(trie[u].id, idx);
        }
    }

    ll get(ll x, ll k) {
        ll idx = 3e5, u = 0;
        bitset<32> bitx = x, bitk = k;
        for (ll i = M - 1; i >= 0; i--) {
            ll xr = bitx[i] ^ bitk[i];
            if (!bitk[i])
                idx = min(idx, trie[trie[u][!bitx[i]]].id);
            if (!trie[u][xr])return idx;
            u = trie[u][xr];
        }
        return min(trie[u].id, idx);
    }
};

int main() {
    baraa
    ll n, k;
    cin >> n >> k;
    vector<ll> a(n);
    for (ll &i: a)cin >> i;
    array<ll, 2> ans = {n + 1, n + 1};
    Trie tree;
    tree.insert(0, -1);
    for (ll i = 0; i < n; i++) {
        if (i)a[i] ^= a[i - 1];
        ll idx = tree.get(a[i], k) + 1;
        if (ans[1] - ans[0] < i - idx or (ans[1] - ans[0] == i - idx and idx < ans[0]))ans[0] = idx, ans[1] = i;
        tree.insert(a[i], i);
    }
    cout << ans[0] + 1 << ' ' << ans[1] - ans[0] + 1;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...