Submission #1302170

#TimeUsernameProblemLanguageResultExecution timeMemory
1302170slimshady45XOR (IZhO12_xor)C++20
100 / 100
227 ms145028 KiB
// template taken from Striver_79
// Remember you were also a novice when you started
// hence never be rude to anyone who wants to learn something
// Never open a ranklist untill and unless you are done with solving problems, wastes 3/4 minutes
// Donot treat CP as a placement thing, love it and enjoy it, you will succeed for sure.
// The goal is to solve problems most efficiently not just barely

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

const int mod = 1e9 + 7;
#define int long long
typedef long long ll;
typedef vector<ll> vi;
typedef vector<vector<int>> vii;
typedef vector<pair<int, int>> vpi;
typedef pair<int, int> pi;

// ------------------ Debug Utilities ------------------
string to_string(const string &s) { return '"' + s + '"'; }
string to_string(const char *s) { return to_string((string)s); }
string to_string(char c) { return string(1, c); }
string to_string(bool b) { return b ? "true" : "false"; }
template <typename A, typename B>
string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; }
template <typename A>
string to_string(A v)
{
    bool first = true;
    string res = "{";
    for (auto &x : v)
    {
        if (!first)
            res += ", ";
        first = false;
        res += to_string(x);
    }
    res += "}";
    return res;
}
void debug_out() { cerr << endl; }
template <typename Head, typename... Tail>
void debug_out(Head H, Tail... T)
{
    cerr << " " << to_string(H);
    debug_out(T...);
}

#ifdef ONLINE_JUDGE
#define debug(...) 42
#else
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#endif
// ------------------------------------------------------

void myerase(ordered_set &t, int v)
{
    int rank = t.order_of_key(v);
    ordered_set::iterator it = t.find_by_order(rank);
    if (it != t.end())
        t.erase(it);
}

int power(long long x, unsigned int y, int p = 1e9 + 7)
{
    int res = 1;
    x %= p;
    if (x == 0)
        return 0;
    while (y > 0)
    {
        if (y & 1)
            res = (res * x) % p;
        y >>= 1;
        x = (x * x) % p;
    }
    return res;
}

int gcdExtended(int a, int b, int *x, int *y)
{
    if (a == 0)
    {
        *x = 0, *y = 1;
        return b;
    }
    int x1, y1;
    int gcd = gcdExtended(b % a, a, &x1, &y1);
    *x = y1 - (b / a) * x1;
    *y = x1;
    return gcd;
}

int modInverse(int b, int m)
{
    int x, y;
    int g = gcdExtended(b, m, &x, &y);
    if (g != 1)
        return -1;
    return (x % m + m) % m;
}

int modDivide(int a, int b, int m)
{
    a %= m;
    int inv = modInverse(b, m);
    if (inv == -1)
        return -1;
    return (inv * a) % m;
}

ll accurateFloor(ll a, ll b)
{
    ll val = a / b;
    while (val * b > a)
        val--;
    return val;
}
struct TrieNode
{
    vector<TrieNode *> children;
    bool isEnd;
    int idx;
    TrieNode()
    {
        isEnd = false;
        idx = 1e9;
        children.assign(2, nullptr);
    }
};
class Trie
{
    TrieNode *root;
    int subquery(TrieNode *root, int idx, int x, int k)
    {
        if (!root)
        {
            return 1e9;
        }
        if (idx < 0)
        {
            return root->idx;
        }

        int nx = x ^ (1LL << idx);
        int xbit = (x >> idx) & 1;
        int kbit = (k >> idx) & 1;
        // debug(xbit,kbit,k,x);
        if (kbit == 0)
        {
            int ans = 1e9;
            if (root->children[xbit ^ 1])
            {
                ans = min(ans, root->children[xbit ^ 1]->idx); // definitely greater than >=k now
            }
            ans = min(ans, subquery(root->children[xbit], idx - 1, x, k));
            return ans;
        }
        else
        {
            if (root->children[xbit ^ 1])
            {
                return subquery(root->children[xbit ^ 1], idx - 1, x, k);
            }
        }
        return 1e9;
    }

public:
    Trie()
    {
        root = new TrieNode();
    }
    void insert(int p, int idx)
    {
        TrieNode *curr = root;
        for (int i = 29; i >= 0; i--)
        {
            int bit = (p >> i) & 1ll;
            if (!curr->children[bit])
            {
                TrieNode *temp = new TrieNode();
                curr->children[bit] = temp;
            }
            curr = curr->children[bit];
            curr->idx = min(idx, curr->idx);
        }
        curr->isEnd = true;
    }
    int query(int p, int l)
    {
        TrieNode *curr = root;
        return subquery(curr, 29, p, l);
    }
};
void solve()
{
    ll n;
    cin >> n;
    ll k;
    cin >> k;
    vi arr(n, 0);
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
    Trie *t = new Trie();
    vector<int> pref(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        pref[i] = pref[i - 1] ^ arr[i - 1];
    }
    t->insert(0, 0);
    int ans = -1e10;
    int idxans=1e9;
    for (int i = 1; i <= n; i++)
    {
        int lidx = t->query(pref[i], k);
        int nans=i-lidx;
        // debug(ans,nans);
        if(nans>ans)
        {
            ans=nans;
            idxans=lidx+1;
        }
        else if(nans==ans)
        {
            idxans=min(idxans,lidx+1);
        }
        t->insert(pref[i],i);
    }
    cout<<idxans<<" "<<ans<<"\n";
}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...