# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
999001 | nguyennh | XOR (IZhO12_xor) | C++14 | 126 ms | 61500 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define el '\n'
using namespace std;
const int MN = 1e5 + 500;
const int N = 3e5 + 5;
const int LG = 31;
int a[N];
struct Trie{
struct Node{
Node* child[2];
int min_pos;
Node (){
for ( int i = 0 ; i <= 1 ; i++ ) child[i] = nullptr;
min_pos = INT_MAX;
}
};
int cur;
Node* root;
Trie () : cur(0){
root = new Node();
}
void add(int x , int pos){
Node* p = root;
for ( int i = LG ; i >= 0 ; i-- ){
int c = x >> i & 1;
if (!p -> child[c]) p -> child[c] = new Node();
p = p -> child[c];
p -> min_pos = min(p -> min_pos , pos);
}
}
int get(int x , int k){
int ans = INT_MAX;
Node* p = root;
for ( int i = LG ; i >= 0 ; i-- ){
int bitx = x >> i & 1;
int bitk = k >> i & 1;
if (bitk){
if (!p -> child[bitx ^ 1]) return ans;
p = p -> child[bitx ^ 1];
}
else {
if (p -> child[bitx ^ 1]) ans = min(ans , p -> child[bitx ^ 1] -> min_pos);
if (!p -> child[bitx]) return ans;
p = p -> child[bitx];
}
}
ans = min(ans , p -> min_pos);
return ans;
}
};
int32_t main (){
// freopen("dmm.inp" , "r" , stdin);
// freopen("dmm.out" , "w" , stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
int n , k;
cin >> n >> k;
for ( int i = 1 ; i <= n ; i++ ) cin >> a[i];
vector<int64_t> pref(n + 5);
for ( int i = 1 ; i <= n ; i++ ) pref[i] = pref[i - 1] ^ a[i];
Trie tr;
int ans = 0 , pos = INT_MAX;
for ( int i = 1 ; i <= n ; i++ ){
tr.add(pref[i - 1] , i - 1);
int left_bound = tr.get(pref[i] , k);
if (left_bound == INT_MAX) continue;
if (ans < i - left_bound){
ans = i - left_bound;
pos = left_bound + 1;
}
else if (ans == i - left_bound){
pos = min(pos , left_bound + 1);
}
}
cout << (pos == INT_MAX ? 0 : pos) << " " << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |