제출 #378507

#제출 시각아이디문제언어결과실행 시간메모리
378507ijxjdjdXOR (IZhO12_xor)C++14
0 / 100
217 ms91372 KiB
#include <bits/stdc++.h> #define FR(i, N) for (int i = 0; i < int(N); i++) #define all(x) std::begin(x), std::end(x) //using namespace std; using ll = long long; const int MAXN = 250000; const int MAXK = 30; int X; int arr[MAXN]; int left[MAXN*MAXK]; int right[MAXN*MAXK]; int mn[MAXN*MAXK]; int sz = 1; std::pair<int, int> ans; void updAns(int i, int j) { if (j-i>ans.second) { ans = {i, j-i}; } else if (j - i == ans.second && j < ans.first) { ans = {i, j-i}; } } void query(int i, int n=0, int b=MAXK-1) { if (b == -1 || n == -1) { return; } else { if ((X&(1<<b)) == 0) { if (arr[i]&(1<<b)) { if (left[n] != -1) { updAns(mn[left[n]], i); } } else { if (right[n] != -1) { updAns(mn[right[n]], i); } } } if ((arr[i]&(1<<b)) == (X&(1<<b))) { query(i, left[n], b-1); } else { query(i, right[n], b-1); } } } void add(int i, int n=0, int b = MAXK-1) { mn[n] = std::min(mn[n], i); if (b == -1) { return; } if (arr[i]&(1<<b)) { if (right[n] == -1) { right[n] = sz++; } add(i, right[n], b-1); } else { if (left[n] == -1) { left[n] = sz++; } add(i, left[n], b-1); } } void upd(int i) { query(i); add(i); } int main() { std::fill(all(left), -1); std::fill(all(right), -1); std::fill(all(mn), MAXN); std::cin.tie(0); std::cin.sync_with_stdio(0); int N; std::cin >> N >> X; X--; if (X == -1) { std::cout << "1 " << N << '\n'; return 0; } arr[0] = 0; add(0); for (int i = 1; i <= N; i++) { std::cin >> arr[i]; arr[i] ^= arr[i-1]; upd(i); } std::cout << ans.first+1 << " " << ans.second << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...