Cod sursă (job #800081)

Utilizator avatar Alex_Mihai10 Mihai Alex-Ioan Alex_Mihai10 IP ascuns
Problemă Cristela (clasele 9-12) Compilator cpp-32 | 1,40 kb
Rundă Arhiva de probleme Status evaluat
Dată 16 dec. 2024 11:00:34 Scor 0
#include <bits/stdc++.h>

using namespace std;

int const MAX=1050000;
int const BIT=20;
int n;
char energy[13];
int per[MAX];
int propag[MAX][BIT+3];
/// propaga la nr asta la bitii activi de la bitul ala in jos

int string_to_bits(char str[]){
    int i;
    int nr=0;
    for(i=0;str[i];++i){
        nr|=(1<<(str[i]-'a'));
    }
    return nr;
}

void add_nr(int nr){
    ++per[nr];
    int i;
    for(i=0;i<BIT;++i){
        if(nr&(1<<i)){
            ++per[nr^(1<<i)];
            ++propag[nr^(1<<i)][i];
        }
    }
}

void read(){
    cin>>n;
    int i;
    for(i=1;i<=n;++i){
        cin>>energy;
        int nr=string_to_bits(energy);
        add_nr(nr);
    }
}

void calc_per(){
    int i;
    for(i=(1<<BIT)-1;i;--i){
        /// e deja calc pt nr asta
        /// acm doar propagam
        int j;
        int sum=0;
        for(j=BIT-1;j>=0;--j){
            sum+=propag[i][j];
            if(i&(1<<j)){
                per[i^(1<<j)]+=sum;
                propag[i^(1<<j)][j]+=sum;
            }
        }
    }
}

long long solve(){
    long long rez=0;
    int i;
    for(i=1;i<(1<<BIT);++i){
        int nrelem=per[i];
        rez-=mobius[i]*1LL*nrelem*(nrelem-1)/2;
    }
    return rez;
}

void write(long long ans){
    cout<<ans;
}

int main()
{
    read();
    calc_per();
    calc_mobius();
    write(solve());
    return 0;
}