Skip to content

14192: 【原4192】异或问题

题目

题目描述

author: Sakiko 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/4192

Description

\(N\)个数字,要求选择 \(M\)次 ,每次从 \(N\) 个数中选出两个数 \((Ai,Aj)\) (但不能和之前某次选择相同), 此次选择的得分为 \(A_i \ xor \ A_j\) 。
求最大得分。

Input Format

第一行包含 两个整数 \(N, M\)
接下来一行共 \(N\) 个整数描述 \(N\) 个数字。

OutPut Format

输出一个整数,表示最大得分除以 \(10^9+7\) 的余数

Sample Input

3 2
1 2 3

Sample Output

5

Data Range

对于 20% 的测试数据, \(N≤1000\)
对于 40% 的测试数据, \(N*M≤500000\)
对于 70% 的测试数据, \(N≤10000\)
对于 100% 的测试数据, \(N≤50000, 0≤A_i≤10^9\)

ligongzzz's solution

#include "iostream"
#include "list"
#include "numeric"
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    int *nums = new int[n];
    for (int i = 0; i < n; i++)
        nums[i] = i;

    //存储最大数据
    list<int> List;
    List.push_back(0);
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            int temp = nums[i] ^ nums[j];
            //插入
            auto p = List.rbegin();
            /*for (; p != List.rend(); p++) {
                if (*p > temp)
                    break;
            }
            if (p != List.rbegin()) {
                List.insert(p.base(), temp);
                if(List.size()>m)
                    List.pop_back();
            }*/
        }
    }

    cout << accumulate(List.begin(), List.end(), 0)%int(1e9+7);

    return 0;
}