結果
| 問題 |
No.1240 Or Sum of Xor Pair
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2020-09-25 22:13:22 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,356 bytes |
| コンパイル時間 | 2,198 ms |
| コンパイル使用メモリ | 199,756 KB |
| 最終ジャッジ日時 | 2025-01-14 20:58:21 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 11 WA * 19 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
const int LOG = 18;
int main(){
int N, X;
cin >> N >> X;
vector<int> A(N);
for (int i = 0; i < N; i++){
cin >> A[i];
}
vector<vector<int>> sum(LOG, vector<int>(1 << (LOG + 1), 0));
vector<int> cnt(1 << (LOG + 1), 0);
for (int i = 0; i < N; i++){
int v = 1;
for (int j = 0; j <= LOG; j++){
for (int k = 0; k < LOG; k++){
if (A[i] >> k & 1){
sum[k][v]++;
}
}
cnt[v]++;
if (j < LOG){
if (A[i] >> (LOG - 1 - j) & 1){
v = v * 2 + 1;
} else {
v = v * 2;
}
}
}
}
long long ans = 0;
for (int i = 0; i < N; i++){
int v = 1;
vector<int> id;
for (int j = LOG - 1; j >= 0; j--){
if (A[i] >> j & 1){
if (X >> j & 1){
id.push_back(v * 2 + 1);
v = v * 2;
} else {
v = v * 2 + 1;
}
} else {
if (X >> j & 1){
id.push_back(v * 2);
v = v * 2 + 1;
} else {
v = v * 2;
}
}
}
for (int x : id){
for (int j = 0; j < LOG; j++){
if (A[i] >> j & 1){
ans += cnt[x] << j;
} else {
ans += sum[j][x] << j;
}
}
}
}
for (int i = 0; i < N; i++){
ans -= A[i];
}
cout << ans / 2 << endl;
}
SSRS