#include #include #include #include #include #include #include #include #include #include // #include "Src/Number/IntegerDivision.hpp" // #include "Src/Utility/BinarySearch.hpp" // #include "Src/Sequence/CompressedSequence.hpp" // #include "Src/Sequence/RunLengthEncoding.hpp" // #include "Src/Algebra/Group/AdditiveGroup.hpp" // #include "Src/DataStructure/FenwickTree/FenwickTree.hpp" // #include "Src/DataStructure/SegmentTree/SegmentTree.hpp" // #include "Src/DataStructure/DisjointSetUnion/DisjointSetUnion.hpp" // #include "Src/DataStructure/Heap/BinaryHeap.hpp" namespace zawa {} using namespace zawa; // #include "atcoder/modint" // using mint = atcoder::modint998244353; // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") using namespace std; template ostream& operator<<(ostream& os, const pair& p) { os << '(' << p.first << ',' << p.second << ')'; return os; } template ostream& operator<<(ostream& os, const vector& v) { for (int i = 0 ; i < ssize(v) ; i++) os << v[i] << (i + 1 == ssize(v) ? "" : " "); return os; } /* * OR..全部0はダメ * AND..全部1じゃないとダメ * * ANDはAから恒久的に削除するだけ。ORが寧ろむずい。 * - ORは1つでも立っているのが存在するとok * - ANDの削除のときに過去のORが全部消える遷移を除外する。 */ int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); cout << fixed << setprecision(20); #if !defined DEBUG int N; cin >> N; vector A(N); for (auto& x : A) cin >> x; int ans = 0; for (int i = 29 ; i >= 0 ; i--) { if (i % 2) { bool fn = 0; for (int v : A) fn |= (v >> i) & 1; ans |= (int)fn << i; } else { vector nxt; int OR = 0; for (int v : A) if ((v >> i) & 1) { OR |= v; nxt.push_back(v); } if (nxt.empty()) continue; bool ok = 1; for (int j = i + 1 ; j < 30 ; j += 2) if ((ans >> j) & 1) ok &= (OR >> j) & 1; if (ok) { ans |= 1 << i; A = move(nxt); } } } cout << ans << '\n'; #else mt19937_64 mt{random_device{}()}; for (int testcase = 0 ; ; ) { cerr << "----------" << ++testcase << "----------" << endl; auto a = solve(), b = naive(); if (a != b) { // print testcase cerr << "you: " << a << endl; cout << "correct: " << b << endl; exit(0); } } #endif }