제출 #1132385

#제출 시각아이디문제언어결과실행 시간메모리
1132385sofija6XOR (IZhO12_xor)C++17
100 / 100
108 ms42480 KiB
#include <bits/stdc++.h>
#define ll long long
#define MAXN 250010
#define MAXV 7000010
#define llinf 1e17
using namespace std;
ll x,nextt[MAXV][2],vall[MAXV],cnt=2,ans;
void Add(ll ind,ll val,ll pos,ll i)
{
    if (pos<0)
        return;
    ll cur=(val&(1<<pos))!=0;
    if (!nextt[ind][cur])
    {
        nextt[ind][cur]=cnt++;
        vall[nextt[ind][cur]]=llinf;
    }
    vall[nextt[ind][cur]]=min(vall[nextt[ind][cur]],i);
    Add(nextt[ind][cur],val,pos-1,i);
}
void Find(ll ind,ll val,ll pos)
{
    ll cura=(val&(1<<pos))!=0,curx=(x&(1<<pos))!=0;
    if (pos<0)
    {
        ans=min(ans,vall[ind]);
        return;
    }
    if (curx)
    {
        ll curr=curx^cura;
        if (!nextt[ind][curr])
            return;
        Find(nextt[ind][curr],val,pos-1);
        return;
    }
    ll curr=1^cura;
    if (nextt[ind][curr])
        ans=min(ans,vall[nextt[ind][curr]]);
    if (nextt[ind][curr^1])
        Find(nextt[ind][curr^1],val,pos-1);
    return;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n,a,ansi,ansk=0,pref=0;
    cin >> n >> x;
    Add(1,0,29,0);
    for (ll i=1;i<=n;i++)
    {
        cin >> a;
        pref^=a;
        ans=llinf;
        Find(1,pref,29);
        if (ans!=llinf && i-ans>ansk)
        {
            ansk=i-ans;
            ansi=ans+1;
        }
        Add(1,pref,29,i);
    }
    cout << ansi << " " << ansk << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...