-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathSOS Bit Problem.cpp
More file actions
63 lines (53 loc) · 1.44 KB
/
Copy pathSOS Bit Problem.cpp
File metadata and controls
63 lines (53 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = (1<<21);
const int S = 21;
int sosDp[N][S];
int sosDp2[N][S];
int sosDp3[N][S];
int invert(int n){
// cout<<"inverting "<<n<<" ";
for(int i=0;i<S-1;i++)
n ^= (1<<i);
//cout<<n<<endl;
return n;
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
//ifstream cin("test_input.txt");
int n;
cin>>n;
int ara[n];
for(int i=0;i<n;i++){
int x;
cin>>x;
ara[i] = x;
sosDp[x][0]++;
sosDp2[x][0]++;
sosDp3[x][0]++;
}
for(int bitmask=0;bitmask< (1<<S-1);bitmask++){
for(int j=1;j<S;j++){
if( bitmask & (1<<(j-1)) ){
sosDp[bitmask][j]+=sosDp[bitmask][j-1];
sosDp[bitmask][j]+=sosDp[bitmask^(1<<(j-1))][j-1];
}else{
sosDp[bitmask][j]+=sosDp[bitmask][j-1];
}
}
}
for(int bitmask=(1<<S-1)-1;bitmask>=0;bitmask--){
for(int j=1;j<S;j++){
if( bitmask & (1<<(j-1)) ){
sosDp2[bitmask][j]+=sosDp2[bitmask][j-1];
}else{
sosDp2[bitmask][j]+=sosDp2[bitmask][j-1];
sosDp2[bitmask][j]+=sosDp2[bitmask^(1<<(j-1))][j-1];
}
}
}
for(int i=0;i<n;i++){
cout<<sosDp[ ara[i] ][S-1]<<" "<<sosDp2[ ara[i] ][S-1]<<" "<<n-sosDp[ invert( ara[i] )][S-1]<<endl;
}
}