SOS Bit Problem

Back to Bitwise Operations

Implementation

C++

                                #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;
 
    }
}