Cod sursă (job #800082)

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

using namespace std;

ifstream fin("cristela.in");
ofstream fout("cristela.out");

int const MAX=1050000;
int const BIT=20;
int n;
char energy[13];
char energ[6000000];
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(){
    fin>>n;
    fin.get();
    fin.getline(energ,6000000);
    int ind1=0,ind2=0;
    int i;
    for(i=1;i<=n;++i){
        ind2=0;
        while(energ[ind1]!=' ' && energ[ind1]){
            energy[ind2++]=energ[ind1++];
        }
        ++ind1;
        energy[ind2]=0;
        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 rez;

void subm(int bit,int cnt,int nr){
    if(bit==BIT){
        if(nr==0)
            return;
        int nrelem=per[nr];
        if(cnt&1){
            rez+=1LL*nrelem*(nrelem-1)/2;
        }
        else{
            rez-=1LL*nrelem*(nrelem-1)/2;
        }
    }
    else{
        subm(bit+1,cnt,nr);
        subm(bit+1,cnt+1,nr+(1<<bit));
    }
}

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

int main()
{
    ios::sync_with_stdio(0);
    fin.tie(0);
    fout.tie(0);
    read();
    calc_per();
    subm(0,0,0);
    write(rez);
    return 0;
}