제출 #1014615

#제출 시각아이디문제언어결과실행 시간메모리
1014615kira_zoldyckXOR (IZhO12_xor)C++14
100 / 100
135 ms119764 KiB
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native")

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update

using namespace std;
using namespace __gnu_pbds;

#define endl "\n"
#define fast ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr);
#define pb push_back
#define F first
#define S second
#define yes cout << "YES" << endl;
#define no cout<<"NO"<<endl;
#define all(x) x.begin(),x.end()
#define allr(x) x.rbegin(),x.rend()
#define MP(x,y) make_pair(x,y)
#define ll long long int

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

const double Pii = 3.14159265358979323846;
const ll mod=                    1e9+7;
const ll mod2=                    998244353;
const ll inf=                    1e16+7;
const int mxN=(2e5 + 5e4)*30+1;
const double eps=0.00000000000000001;


ll gcd(ll a , ll b) {return b ? gcd(b , a % b) : a ;}
ll lcm(ll a , ll b) {return (a * b) / gcd(a , b);}
ll inv(ll i,ll mod) {if (i == 1) return 1; return (mod - ((mod / i) * inv(mod % i,mod)) % mod) % mod;}
/*
don't start implementing until you have a solid idea and you are 90% sure of it!
----
be always fully focused, sometimes we waste time thinking about nothing!
----
when we ask more questions we have a higher probability to find our way to the solution!
----
don't give up on a problem until you have questionned all the questions you can ask urself!
(trying greedy approaches , thinking about a trick ,about using a certain data structure
a certain algorithm,opting for a certain principle (e.g: pigeon principe) , solving the opposite problem,playing with examples in order to find
a pattern, thinking backwards, and most importantly, thinking about the box!
----
when u ask a question, try to prove it either it's correct or wrong,if it's wrong or it seems
it will take us nowhere =>try another approach.
----
don't get stuck at one approach!
----
apply teleportation, if we could do this? could we solve the next task?
----
implement very carefully!
----
RE : out_of_bounds, deleting an element from an empty data_structures, dividing by zero .
----
*/


/*
order_of_key (k) : Number of items strictly smaller than k .
find_by_order(k) : K-th element in a set (counting from zero).
*/


int k;
int to[mxN][2] ,firstTraverse[mxN][2];
int nodeCount=0;
int nextNode(){
    return ++nodeCount;
}

// 0 is the root
void insert(int val,int ind){
    int currNode=0;
    for (int i = 30; i >= 0; i--) {
      int b=(val>>i)&1;
      if (to[currNode][b] == -1){
        to[currNode][b]=nextNode();
      }
      currNode=to[currNode][b];
      if(firstTraverse[currNode][b]==-1)firstTraverse[currNode][b]=ind;
    }
}

int query(int val){
    int currNode=0,mn=1e9;
    for (int i = 30; i >= 0; i--) {
      if(currNode==-1)return mn;
      int b=!((val>>i)&1);
      if (to[currNode][b] == -1){
        if((1<<i)&k)return mn;
        currNode=to[currNode][1^b];
      }else{
        if((1<<i)&k)currNode=to[currNode][b];
        else{
            mn=min(mn,firstTraverse[to[currNode][b]][b]);
            currNode=to[currNode][1^b];
        }
      }
    }
    return mn;
}



void solve(){
    int n;
    cin>>n>>k;
    k--;
    memset(firstTraverse,-1,sizeof(firstTraverse));
    memset(to,-1,sizeof(to));
    insert(0,0);
    int curr=0;
    int l=2,r=1;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        curr^=x;
        int mn=query(curr);
        insert(curr,i);
        assert(mn!=-1);
        if(r-l<i-(mn+1)){
            r=i;
            l=mn+1;
        }
    }
    cout<<l<<" "<<(r-l)+1<<endl;
}



int main(){
    fast
//    freopen("cases.in","r",stdin);
//    freopen("output.txt","w",stdout);
//    cout<<fixed<<setprecision(12);
    int t=1;
//    cin>>t;
    while(t--)solve();
    return 0;
}



/*
Keeeeeeeeeep goiiiiiing gonnaaaa do it now or after it's just a matter of time inchallah
*/
#Verdict Execution timeMemoryGrader output
Fetching results...