제출 #1268410

#제출 시각아이디문제언어결과실행 시간메모리
1268410iamarmanXOR (IZhO12_xor)C++20
100 / 100
314 ms57588 KiB

#include<bits/stdc++.h>

using namespace std;


class TrieNode
{
public:
    TrieNode *left;
    TrieNode *right;
    int cnt;
    int ind;
    TrieNode()
    {
        left=NULL;
        right=NULL;
        cnt=0;
        ind=1e9;
    }
};

class Trie
{
    TrieNode *root;
public:

    Trie()
    {
        root=new TrieNode();
    }

    void insert(int n,int id)
    {
        TrieNode *curr=root;
        for(int i=31;i>=0;i--)
        {
            int bit=(1&(n>>i));
            if(bit==0)
            {
                if(curr->left==NULL)
                {
                    curr->left=new TrieNode();
                }
                curr=curr->left;
                curr->cnt++;
                curr->ind=min(curr->ind,id);
            }
            else
            {
                if(curr->right==NULL)
                {
                    curr->right=new TrieNode();
                }
                curr=curr->right;
                curr->cnt++;
                curr->ind=min(curr->ind,id);
            }
        }
    }

    void remove(int n) 
    {
        TrieNode* curr = root;

        for (int i = 31; i >= 0; i--) 
        {
            if(curr==NULL)
            {
                break;
            }
            
            int bit = (n >> i) & 1;

            if (bit == 0) 
            {
                curr = curr->left;
                curr->cnt--;
            } 
            else 
            {
                curr = curr->right;
                curr->cnt--;
            
            }
        }

    } 

    pair<int,int> max_xor_pair(int n)
    {
        TrieNode *curr=root;
        int ans=0;
        for(int i=31;i>=0;i--)
        {
            if(curr==NULL)
            {
                break;
            }
            int bit=(1&(n>>i));

            if(bit==0)
            {
                if(curr->right!=NULL and curr->right->cnt>0)
                {
                    ans+=(1<<i);
                    curr=curr->right;
                }
                else 
                {
                    curr=curr->left;
                }
            }
            else
            {
                if(curr->left!=NULL and curr->left->cnt>0)
                {
                    ans+=(1<<i);
                    curr=curr->left;
                }
                else
                {
                    curr=curr->right;
                }
            }
        }
        return {ans,curr->ind};
    }

    
};
void solve()
{
    int n,x;
    cin>>n>>x;
    vector<int> vec(n+1);
    for(int i=1;i<=n;i++)
    {
        cin>>vec[i];
        vec[i]^=vec[i-1];
    }

    Trie tr;
    tr.insert(0,0);
    int lenght=0;
    int start=0;
    for(int i=1;i<=n;i++)
    {
        auto cur=tr.max_xor_pair(vec[i]);
        if(cur.first>=x)
        {
            int len=i-cur.second;
            if(len>lenght)
            {
                start=cur.second;
                lenght=len;
            }
        }
        tr.insert(vec[i],i);
    }

    cout<<start+1<<" "<<lenght<<'\n';

}


int main()
{ 
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int t=1;
   // cin>>t;
    for(int i=1;i<=t;i++)
    {
         //cout<<"Case "<<i<<": ";
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...