Cod sursa(job #3321764)

Utilizator ilincaSSirbu Ilinca-Maria eu ilincaS Data 11 noiembrie 2025 11:54:13
Problema Xor Max Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.77 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define int long long
using namespace std;

ifstream cin("xormax.in");
ofstream cout("xormax.out");

int mx=0, r1=100000, r2=100000;
int p;
int v[100005];
vector <int> ia;
vector <int> ib;

void rec(int k, vector <int> &a, vector <int> &b, int sum, int put)
{
    //mx=max(mx, sum);
    if(k==-1)
    {
        if(mx<sum)
        {
            mx=sum;
            sort(a.begin(), a.end());
            sort(b.begin(), b.end());
            int x=0, y=0;
            x=a[0];
            y=b[0];
            if(x>y)
            {
                swap(x, y);
            }
            r1=x;
            r2=y;
        }
        else if(mx==sum)
        {
            sort(a.begin(), a.end());
            sort(b.begin(), b.end());
            int x=0, y=0;
            x=a[0];
            y=b[0];
            if(x>y)
            {
                swap(x, y);
            }
            if(y<r2)
            {
                r1=x;
                r2=y;
            }
            else if(y==r2)
            {
                if(x>r1)
                {
                    r1=x;
                }
            }
        }
        return;
    }
    int ok1=0, ok2=0;
    vector <int> a0;
    vector <int> a1;
    vector <int> b0;
    vector <int> b1;
    //cout<<k<<" "<<sum<<endl<<"a : ";
    for(auto i:a)
    {
        //cout<<i<<" ";
        if((v[i]>>k)%2==0)
        {
            a0.push_back(i);
        }
        else
        {
            a1.push_back(i);
        }
    }
    //cout<<endl;
    //cout<<"b : ";
    for(auto i:b)
    {
        //cout<<i<<" ";
        if((v[i]>>k)%2==0)
        {
            b0.push_back(i);
        }
        else
        {
            b1.push_back(i);
        }
    }
    /*
    cout<<endl<<"a0 : ";
    for(auto i:a0)
    {
        cout<<i<<" ";
    }
    cout<<endl<<"a1 : ";
    for(auto i:a1)
    {
        cout<<i<<" ";
    }
    cout<<endl<<"b0 : ";
    for(auto i:b0)
    {
        cout<<i<<" ";
    }
    cout<<endl<<"b1 : ";
    for(auto i:b1)
    {
        cout<<i<<" ";
    }
    cout<<endl;*/

    if(b0.size()>0 && a1.size()>0)
    {
        ok2=1;
        //rec(k-1, b0, a1, sum+p);
    }
    if(a0.size()>0 && b1.size()>0)
    {
        ok1=1;
        //rec(k-1, a0, b1, sum+p);
    }
    if(ok1==1)
    {
        rec(k-1, a0, b1, sum+put/2, put/2);
    }
    if(ok2==1)
    {
        rec(k-1, b0, a1, sum+put/2, put/2);
    }
    if(ok1==0 && ok2==0)
    {
        rec(k-1, a, b, sum, put/2);
    }


}

signed main()
{
    int n, x;
    cin>>n;
    ia.push_back(0);
    for(int i=1; i<=n; i++)
    {
        cin>>x;
        v[i]=v[i-1]^x;
        if((v[i]>>20)%2==0)
        {
            ia.push_back(i);
        }
        else
        {
            ib.push_back(i);
        }
        //cout<<v[i]<<" ";
    }
    //cout<<endl;
    p=(1<<20);
    if(ia.size()>0 && ib.size()>0)
    {
        rec(19, ia, ib, p, p);
    }
    else
    {
        for(int i=19; i>=0; i--)
        {
            p/=2;
            ia.clear();
            ib.clear();
            for(int j=0; j<=n; j++)
            {
                if((v[j]>>i)%2==0)
                {
                    ia.push_back(j);
                }
                else
                {
                    ib.push_back(j);
                }
            }
            if(ia.size()>0 && ib.size()>0)
            {
                rec(i-1, ia, ib, p, p);
                break;
            }
        }
        //rec(19, ia, ib, 0);
    }
    if(r1>r2)
    {
        swap(r1, r2);
    }
    if(r1==r2 && r1==100000)
    {
        r1=r2=1;
    }
    cout<<mx<<" "<<r1+1<<" "<<r2;

    return 0;
}