Submission #1149231

#TimeUsernameProblemLanguageResultExecution timeMemory
1149231hokshaXOR (IZhO12_xor)C++20
100 / 100
97 ms42436 KiB
#include "bits/stdc++.h"
using namespace std;
const int M = 31;
struct Node{
    int ch[2]{};
    int sz = 0;
    int mnIndex = 1e9;
    int isEnd = 0;
    int &operator[](char x){
        return ch[x];
    }
};
struct Trie{
    vector<Node>trie;

    int newNode(){
        trie.emplace_back();
        return trie.size() - 1;
    }
    Trie(){init();}
    void init() {
        trie.clear();
        trie.emplace_back();
    }
    void insert(int num, int index){
        int cur = 0;
        for(int i = M;  i>= 0; i--){
            int bit = num >>i & 1;
            if (trie[cur][bit] == 0) trie[cur][bit] = newNode();
            cur = trie[cur][bit];
            trie[cur].mnIndex = min(trie[cur].mnIndex,index);
        }
        trie[cur].isEnd++;
    }

    int getAns(int pre, int x){
        int cur = 0;
        int minAns = 1e9;
        for(int i = M; i >= 0; --i){
            int bitP = pre >> i & 1;
            int bitX = x >> i & 1;
            if (bitP == 1 && bitX == 0){
                if (trie[cur][0]){
                    minAns = min(minAns, trie[trie[cur][0]].mnIndex);
                }
            }
            else if (bitP == 0 && bitX == 0){
                if (trie[cur][1]){
                    minAns = min(minAns, trie[trie[cur][1]].mnIndex);
                }
            }


            if (trie[cur][bitP ^ bitX]){
                cur = trie[cur][bitP ^ bitX];
            }
            else break;
        }
        if(trie[cur].isEnd){
            minAns = min(minAns, trie[cur].mnIndex);
        }
        return minAns;
    }


};
void fast() {
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(0);

}
int main(){
    fast();
    int n, x; cin >> n >> x;
    vector<int>a(n + 1);
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
        a[i] ^= a[i - 1];
    }
    Trie trie;
    trie.insert(0, 0);
    int mxL = 0, L = 1e9;
    for(int i = 1; i <= n; i++){
        int minI  = trie.getAns(a[i], x);
        if (minI== 1e9){
            trie.insert(a[i], i);
            continue;
        }
        if (i  - minI > mxL){
            mxL = i - minI;
            L = minI + 1;
        }
        else if (i - minI == mxL){
            if (minI + 1< L){
                L = minI + 1;
            }
        }
        trie.insert(a[i], i);
    }
    cout << L << ' ' << mxL << endl;





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