結果

問題 No.5001 排他的論理和でランニング
ユーザー pekempeypekempey
提出日時 2018-03-16 23:51:53
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 1,978 bytes
コンパイル時間 842 ms
実行使用メモリ 19,096 KB
スコア 0
最終ジャッジ日時 2020-03-12 19:40:29
ジャッジサーバーID
(参考情報)
judge7 /
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
testcase_44 -- -
testcase_45 -- -
testcase_46 -- -
testcase_47 -- -
testcase_48 -- -
testcase_49 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <map>

using namespace std;

const int N = 1e5;

int n, m;
int a[N];
vector<int> used[N];

vector<int> merge(vector<int> a, vector<int> b) {
  map<int, int> mp;
  for (int x : a) mp[x]++;
  for (int x : b) mp[x]++;
  vector<int> res;
  for (auto kv : mp) {
    if (kv.second % 2 == 1) {
      res.push_back(kv.first);
    }
  }
  return res;
}

void swap_row(int i, int j) {
  swap(a[i], a[j]);
  swap(used[i], used[j]);
}

// i -> j
void add_row(int i, int j) {
  a[j] ^= a[i];
  used[j] = merge(used[i], used[j]);
}

int gauss() {
  int r = 0;
  for (int j = 20; j >= 0; j--) {
    int p = -1;
    for (int i = r; i < n; i++) {
      if (a[i] >> j & 1) {
        p = i;
        break;
      }
    }
    if (p == -1) continue;
    swap_row(r, p);
    for (int i = r + 1; i < n; i++) {
      if (a[i] >> j & 1) {
        add_row(r, i);
      }
    }
    r++;
  }
  return r;
}

void answer(vector<int> a) {
  for (int i = 0; i < a.size(); i++) {
    if (i > 0) cout << ' ';
    cout << a[i] + 1;
  }
  cout << endl;
  exit(0);
}

int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    used[i].push_back(i);
  }
  int r = gauss();

  cerr << "rank " << r << endl;
  vector<int> res;
  int curr = 0;
  for (int i = 0; i < r; i++) {
    for (int j = 0; j < used[i].size(); j++) {
      cerr << used[i][j] << ' ';
    }
    cerr << endl;
  }
  cerr << endl;
  for (int i = 0; i < r; i++) {
    auto next_res = merge(res, used[i]);
    if ((curr ^ a[i]) > curr && next_res.size() <= m) {
      curr ^= a[i];
      res = next_res;
    }
    if (res.size() == m) break;
  }
  cerr << curr << endl;
  if (res.size() == m) {
    answer(res);
  }
  cerr << res.size() << endl;
  for (int i = r; i < n; i++) {
    auto next_res = merge(res, used[i]);
    if (next_res.size() == m) {
      answer(next_res);
    }
    if (next_res.size() < m) {
      res = next_res;
    }
  }
}
0