Cod sursa(job #2866694)

Utilizator cadmium_Voicu Mihai-Valeriu cadmium_ Data 9 martie 2022 21:46:58
Problema Xor Max Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
#warning asta e pentru andu cu trie pe biti
#define EOL -1
using namespace std;
#define cin fin
#define cout fout
ifstream cin("xormax.in");
ofstream cout("xormax.out");

const int nmax = 1e5 + 5; //bounduri ca sa se oftice haterii
namespace Trie {
  struct Trie {
    Trie* bit[2];
    int poz;
    Trie() {
      poz = 1e9;
      memset(bit, 0, sizeof(bit));
    }
  };
  using ts = Trie*;
  ts root = new Trie;
  void insert(int* s, int val, ts node = root) {
    if(s[0] == EOL) {
      node -> poz = min(node -> poz, val);
      return;
    }
    if(node -> bit[s[0]] == 0)
      node -> bit[s[0]] = new Trie;
    insert(s + 1, val, node -> bit[s[0]]);
  }
  int maxx = -1;
  int lf, rh;
  bool dfs(ts l = root, ts r = root, int iter = 0, int k = 0) {
    if(l == 0 || r == 0)
      return 0;
    if(iter == 22) {
      int clf = l -> poz;
      int crh = r -> poz;
      if(crh < clf)
        swap(crh, clf);
      if(k > maxx || (k == maxx && (clf < lf || rh - lf > crh - clf))) 
        maxx = k, lf = clf, rh = crh;
      return 1;
    }
    if(dfs(l -> bit[0], r -> bit[1], iter + 1, ((k << 1) | 1)) 
    || dfs(l -> bit[1], r -> bit[0], iter + 1, ((k << 1) | 1)))
      return 1;
    if(dfs(l -> bit[0], r -> bit[0], iter + 1, (k << 1))
    || dfs(l -> bit[1], r -> bit[1], iter + 1, (k << 1)))
      return 1;
    return 0;
  }
};
 
int v[nmax]; // vectori ca sa se oftice haterii
int s[40]; // bounduri ca sa se oftice haterii
int main() {
  int n;
  cin >> n;
  for(int i = 0; i <= n; i++) {
    if(i != 0)
      cin >> v[i], v[i] ^= v[i - 1];
    for(int j = 21; j >= 0; j--) {
      s[21 - j] = (v[i] & (1 << j)) > 0;
    }
    s[22] = EOF;
    Trie::insert(s, i);
  }
  Trie::dfs();
  if(Trie::lf > Trie::rh)
    swap(Trie::lf, Trie::rh);
  Trie::lf = min(Trie::rh, Trie::lf + 1);
  cout << Trie::maxx << ' ' << Trie::lf << ' ' << Trie::rh << '\n';
}