Language: C++

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N;
    long long K;
    cin >> N >> K;
    vector<long long> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];
        
    long long res = 0;
    for (int d = 60; d >= -1; --d) { // d = -1 は X = K の場合
        if (d != -1 && !(K & (1LL<<d))) continue;
        
        long long tmp = 0;
        for (int e = 60; e >= 0; --e) {
            long long mask = 1LL<<e;
            int num = 0;
            for (int i = 0; i < N; ++i) if (A[i] & mask) ++num;
            
            if (e > d) {
                if (K & mask) tmp += mask * (N - num);
                else tmp += mask * num;
            }
            else if (e == d) {
                tmp += mask * num;
            }
            else {
                tmp += mask * max(num, N - num);
            }
        }
        res = max(res, tmp);
    }
    cout << res << endl;
}
解法 2: 桁 DP
というわけで、この問題が桁 DP で解けるということ自体はとても自然だと思うし、そもそも

K 以下の x についての f(x) の最大値を求めることが要求されている時点で、桁DPがうまくいくことが多い

という風にやった方も多いと思う。慣れていたらゴチャゴチャ考えずに、そうやった方が早いかもしれない。詳しくは

桁 DP の思想 〜 K 以下の整数を走査するとはどういうことか 〜
の方に書いてみました。

#include <iostream>
#include <vector>
using namespace std;
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }

long long dp[100][2];

int main() {
    int N;
    long long K;
    cin >> N >> K;
    vector<long long> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];
    
    for (int i = 0; i < 100; ++i) dp[i][0] = dp[i][1] = -1;
    dp[45][0] = 0;
    for (int d = 44; d >= 0; --d) {
        long long mask = 1LL<<d;
        int num = 0;
        for (int i = 0; i < N; ++i) if (A[i] & mask) ++num;
        
        if (dp[d+1][1] >= 0) chmax(dp[d][1], dp[d+1][1] + mask * max(num, N-num));
        if (dp[d+1][0] >= 0) {
            if (K & (1LL<<d)) {
                chmax(dp[d][1], dp[d+1][0] + mask * num);
                chmax(dp[d][0], dp[d+1][0] + mask * (N-num));
            }
            else {
                chmax(dp[d][0], dp[d+1][0] + mask * num);
            }
        }
    }
    cout << max(dp[0][0], dp[0][1]) << endl;
}

Compiler output:
a.cc:38:1: error: extended character 、 is not valid in an identifier
   38 | というわけで、この問題が桁 DP で解けるということ自体はとても自然だと思うし、そもそも
      | ^
a.cc:38:31: error: extended character 、 is not valid in an identifier
   38 | というわけで、この問題が桁 DP で解けるということ自体はとても自然だと思うし、そもそも
      |                               ^
a.cc:40:28: error: extended character 、 is not valid in an identifier
   40 | K 以下の x についての f(x) の最大値を求めることが要求されている時点で、桁DPがうまくいくことが多い
      |                            ^
a.cc:42:1: error: extended character 。 is not valid in an identifier
   42 | という風にやった方も多いと思う。慣れていたらゴチャゴチャ考えずに、そうやった方が早いかもしれない。詳しくは
      | ^
a.cc:42:1: error: extended character 、 is not valid in an identifier
a.cc:42:1: error: extended character 。 is not valid in an identifier
a.cc:44:14: error: extended character 〜 is not valid in an identifier
   44 | 桁 DP の思想 〜 K 以下の整数を走査するとはどういうことか 〜
      |              ^
a.cc:44:58: error: extended character 〜 is not valid in an identifier
   44 | 桁 DP の思想 〜 K 以下の整数を走査するとはどういうことか 〜
      |                                                          ^
a.cc:45:1: error: extended character 。 is not valid in an identifier
   45 | の方に書いてみました。
      | ^
a.cc:37:1: error: '\U000089e3\U00006cd5' does not name a type
   37 | 解法 2: 桁 DP
      | ^~~~
a.cc:54:5: error: redefinition of 'int main()'
   54 | int main() {
      |     ^~~~
a.cc:5:5: note: 'int main()' previously defined here
    5 | int main() {
      |     ^~~~