結果
| 問題 | No.184 たのしい排他的論理和(HARD) |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-04-17 00:05:33 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,651 bytes |
| 記録 | |
| コンパイル時間 | 1,414 ms |
| コンパイル使用メモリ | 168,516 KB |
| 実行使用メモリ | 792,992 KB |
| 最終ジャッジ日時 | 2024-07-04 11:14:59 |
| 合計ジャッジ時間 | 10,452 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 WA * 6 RE * 6 MLE * 1 -- * 13 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> VI;
typedef vector<VI> VVI;
#define REP(i, n) for(int(i)=0;(i)<(n);++(i))
#define FOR(i, f, t) for(int(i)=(f);(i)<(t);(++i))
#define RREP(i, n) for(int(i)=(n)-1;(i)>=0;--(i))
const int MOD = int(1e9+7);
int N;
ll A[5555];
class uf_ {
public:
vector<int> node;
uf_(int n) : node(n, -1){;}
void con(int n, int m){
n = root(n); m = root(m); if(n == m) return;
node[n] += node[m]; node[m] = n;
}
bool is_con(int n, int m){ return root(n) == root(m); }
int root(int n){ return (node[n] < 0) ? n : node[n] = root(node[n]); }
int size(int n){ return -node[root(n)]; }
};
bool f[66];
int main(){
do { cin.tie(0); ios_base::sync_with_stdio(false); } while(0);
cin >> N;
REP(i,N) cin >> A[i];
uf_ uf(62);
REP(i,N){
ll a = A[i];
int k = 0;
REP(j,61){
if((a>>j)&1){ k = j; break; }
}
FOR(j,k+1,61) if((a>>j)&1) uf.con(k,j);
}
ll res = 1;
REP(i,61){
int k = uf.root(i);
if(f[k]) continue;
f[k] = true;
ll mask = 0;
REP(j,61){
if(!uf.is_con(i,j)) continue;
mask |= 1LL<<j;
}
set<ll> s; s.insert(0);
REP(j,N){
ll a = A[j]&mask;
set<ll> t;
for(auto it = s.begin(); it != s.end(); ++it){
t.insert(*it ^ a);
}
s.insert(t.begin(), t.end());
}
res *= s.size();
}
cout << res << endl;
return 0;
}