# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
873345 | ObadaKh | XOR (IZhO12_xor) | C++17 | 279 ms | 86636 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
/*-------------------------*/
#define ll long long
#define ld long double
#define all(v) v.begin(),v.end()
#define allr(v) v.rbegin(),v.rend()
#define Dracarys ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
template<typename T> using indexed_multiset = tree<T, null_type, greater_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef pair<ll, int> pi;
const int N = 2e5 + 10;
const int infi = 1e9 + 10;
const ll infl = 1e18 + 10;
const int MOD = 1e9 + 7;
const ld eps = 1e-9;
string ScanString() {
char ch[100000];
scanf("%s", ch);
return ch;
}
const int LOG = 32;
struct TrieNode {
TrieNode *child[2];
int Cnt, End, index;
TrieNode() {
memset(child, 0, sizeof child);
Cnt = End = 0;
index = infi;
}
void add(int i, int id, bitset<LOG> &bt) {
int cur = bt[i];
if (child[cur] == 0) child[cur] = new TrieNode();
child[cur]->Cnt++;
if (child[cur]->index == infi)child[cur]->index = id;
if (i == 0) {
child[cur]->End++;
return;
}
child[cur]->add(i - 1, id, bt);
}
void add(int num, int id) {
Cnt++;
if (index == infi)index = id;
bitset<LOG> bt(num);
add(LOG - 1, id, bt);
}
int Query(int i, bitset<LOG> p, bitset<LOG> l) {
if (i == -1)return index;
int curp = p[i], curl = l[i], ret = infi;
if (!curp && !curl) {
if (child[1])ret = child[1]->index;
if (child[0])ret = min(ret, child[0]->Query(i - 1, p, l));
return ret;
}
if (curp && curl) {
if (child[0])ret = child[0]->Query(i - 1, p, l);
return ret;
}
if (!curp && curl) {
if (child[1])return ret = child[1]->Query(i - 1, p, l);
return ret;
}
if (curp && !curl) {
if (child[0])ret = child[0]->index;
if (child[1])ret = min(ret, child[1]->Query(i - 1, p, l));
return ret;
}
}
int Query(int p, int l) {
bitset<LOG> bt1(p), bt2(l);
return Query(LOG - 1, bt1, bt2);
}
void clear() {
for (int i = 0; i < 2; i++)
if (child[i])
child[i]->clear(), delete child[i], child[i] = 0;
}
};
void RunTime(int Tc) {
int n, k;
cin >> n >> k;
TrieNode *Root = new TrieNode();
int pref = 0;
int res1 = 0, res2 = 0;
Root->add(0, 0);
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
pref ^= x;
Root->add(pref, i);
int val = Root->Query(pref, k);
if (val == infi)continue;
int tmp1 = val + 1, tmp2 = i - val;
if (tmp2 > res2)res1 = tmp1, res2 = tmp2;
else if (tmp2 == res2 && tmp1 < res1)res1 = tmp1, res2 = tmp2;
}
cout << res1 << ' ' << res2 << endl;
Root->clear();
delete Root;
}
int main() {
Dracarys
int T = 1;
//cin >> T;
for (int Tc = 1; Tc <= T; Tc++) {
RunTime(Tc);
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |