# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1044419 | KN200711 | XOR (IZhO12_xor) | C++14 | 1 ms | 348 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
# include <bits/stdc++.h>
# define ll long long
# define ld long double
# define pii pair<int, int>
# define fi first
# define se second
using namespace std;
int main() {
int N;
ll x;
scanf("%d %lld", &N, &x);
vector<ll> arr(N);
for(int i=0;i<N;i++) {
scanf("%lld", &arr[i]);
if(i > 0) arr[i] ^= arr[i - 1];
}
int c = -1, len = -1;
for(int i=0;i<=29;i++) {
ll cek = (((1ll << i) - 1) << (30 - i));
ll cc = (1ll << (29 - i));
if(x&(1ll << (29 - i))) continue;
ll need = (x&cek) * 2ll + 1ll;
map<int, int> M;
M[0] = 0;
for(int k=0;k<N;k++) {
ll v = arr[k] & cek;
ll v1 = arr[k] & cc;
v = 2ll * v;
if(v1) v++;
// cout<<"i : "<<i<<" "<<k<<" "<<v<<" "<<need<<endl;
if(M.count(v ^ need)) {
int nw = M[v ^ need];
// cout<<"k : "<<k<<" "<<nw<<endl;
if(k + 1 - nw > len) {
len = k + 1 - nw;
c = nw + 1;
} else if(k + 1 - nw == len) {
c = min(c, nw + 1);
}
}
if(!M.count(v)) M[v] = k + 1;
}
}
// cout<<c<<" "<<len<<endl;
map<int, int> M;
M[0] = 0;
for(int k=0;k<N;k++) {
if(M.count(arr[k] ^ x)) {
int v = M.count(arr[k] ^ x);
if(k + 1 - v > len) {
len = k + 1 - v;
c = v + 1;
} else if(k + 1 - v == len) {
c = min(c, v + 1);
}
if(!M.count(arr[k])) M[arr[k]] = k + 1;
}
}
printf("%d %d\n", c, len);
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |