제출 #16855

#제출 시각아이디문제언어결과실행 시간메모리
16855muratXOR (IZhO12_xor)C++98
90 / 100
153 ms81800 KiB
#include <bits/stdc++.h> using namespace std; #define dbgs(x) cerr << (#x) << " --> " << (x) << ' ' #define dbg(x) cerr << (#x) << " --> " << (x) << endl #define foreach(i,x) for(type(x)i=x.begin();i!=x.end();i++) #define FOR(ii,aa,bb) for(int ii=aa;ii<=bb;ii++) #define ROF(ii,aa,bb) for(int ii=aa;ii>=bb;ii--) #define type(x) __typeof(x.begin()) #define orta (bas + son >> 1) #define sag (k + k + 1) #define sol (k + k) #define pb push_back #define mp make_pair #define nd second #define st first #define endl '\n' typedef pair < int ,int > pii; typedef long long ll; const long long linf = 1e18+5; const int mod = (int) 1e9 + 7; const int logN = 17; const int inf = 1e9; const int N = 250001; int F[N << 4], S = 1, mx[N << 4], mn[N << 4], t, n, m, x, y, z, a[N], b[N], way[N << 4][2]; void insert(int x, int index) { int node = 1; ROF(i, 29, 0) { int t = (1 << i) & x; t = t != 0; if(!way[node][t]) way[node][t] = ++S; node = way[node][t]; } F[node] = max(F[node], index); } pii dfs(int node) { mn[node] = inf; if(way[node][0]) { pii temp = dfs(way[node][0]); mx[node] = max(mx[node], temp.st); mn[node] = min(mn[node], temp.nd); } if(way[node][1]) { pii temp = dfs(way[node][1]); mx[node] = max(mx[node], temp.st); mn[node] = min(mn[node], temp.nd); } if(mx[node] == 0) mx[node] = mn[node] = F[node]; return mp(mx[node], mn[node]); } int solve(int node, int d, int y) { if(d == 0) return mx[node]; if((x & (1 << d)) && (y & (1 << d))) { if(way[node][0]) return solve(way[node][0], d-1, y); else return 0; } if(y & (1 << d)) { if(way[node][1]) return max(solve(way[node][1], d-1, y), mx[way[node][0]]); else return mx[way[node][0]]; } if(x & (1 << d)) { if(way[node][1]) return solve(way[node][1], d-1, y); else return 0; } if(way[node][0]) return solve(way[node][0], d-1, y); else return 0; } int main() { scanf("%d %d",&n, &x); FOR(i, 1, n) { scanf("%d", &a[i]); b[i] = a[i] ^ b[i-1]; insert(b[i], i); } dfs(1); FOR(i, 1, n) { t = max(t, solve(1, 29, b[i]) - i); } FOR(i, 0, n-t) if((b[i+t] ^ b[i]) >= x) { cout << i + 1 << ' ' << t << endl; return 0; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...