ABC 117
Table of Contents
https://atcoder.jp/contests/abc117
A. Entrance Examination
https://atcoder.jp/contests/abc117/tasks/abc117_a
B. Polygon
https://atcoder.jp/contests/abc117/tasks/abc117_b
C. Streamline
https://atcoder.jp/contests/abc117/tasks/abc117_c
D. XXOR
https://atcoder.jp/contests/abc117/tasks/abc117_d
桁 DP で解ける問題だということをわかった上で自力 AC
void solve() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ll N, K;
    cin >> N >> K;
    vll A(N);
    rep(i, N) cin >> A[i];
    vint Kbit;
    vvint Abit(N);
    int mx = 60;
    {
        ll t = K;
        rep(i, mx) {
            Kbit.push_back(t % 2);
            t /= 2;
        }
        reverse(all(Kbit));
        rep(i, N) {
            ll a = A[i];
            rep(j, mx) {
                Abit[i].push_back(a % 2);
                a /= 2;
            }
            reverse(all(Abit[i]));
        }
    }
    vector dp(mx + 1, vll(2));
    rep2(i, 1, mx + 1) {
        int t = Kbit[i - 1];
        ll cnt = 0;
        rep(j, N) {
            cnt += Abit[j][i - 1];
        }
        rep(d, 2) {
            if (d < t) {
                chmax(dp[i][1], dp[i - 1][0] * 2 + cnt);
            }
            if (d == t) {
                if (d == 0)
                    chmax(dp[i][0], dp[i - 1][0] * 2 + cnt);
                else
                    chmax(dp[i][0], dp[i - 1][0] * 2 + N - cnt);
            }
            if (dp[i - 1][1]) {
                chmax(dp[i][1], dp[i - 1][1] * 2 + max(N - cnt, cnt));
            }
        }
    }
    cout << max(dp[mx][0], dp[mx][1]) << endl;
}
void solve() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int m = 60;
    auto f = [&](ll x) -> vint {
        vint v;
        rep(i, m) {
            v.push_back(x % 2);
            x /= 2;
        }
        reverse(all(v));
        return v;
    };
    ll N, K;
    cin >> N >> K;
    vll A(N);
    rep(i, N) cin >> A[i];
    vint kbit = f(K);
    vvint abits(N);
    rep(i, N) {
        abits[i] = f(A[i]);
    }
    // dp[is_less]
    vll dp(2, -1);
    dp[0] = 0;
    rep(i, m) {
        int t = kbit[i];
        vll dpn(2, -1);
        rep(d, 2) rep(is_less, 2) {
            if (!is_less && d > t) continue;  // K 超える数は NG
            if (dp[is_less] == -1) continue;  // 未到達な状態からの遷移は NG
            int is_less_n = is_less || d < t;
            ll cnt = 0;
            for (vint& a : abits) {
                cnt += a[i] ^ d;
            }
            chmax(dpn[is_less_n], dp[is_less] * 2 + cnt);
        }
        swap(dp, dpn);
    }
    cout << max(dp[0], dp[1]) << endl;
}