Cod sursă (job #800094)

Utilizator avatar AnSeDra Andrei Sebastian Dragulescu AnSeDra IP ascuns
Problemă Cristela (clasele 9-12) Compilator cpp-32 | 1,27 kb
Rundă Arhiva de probleme Status evaluat
Dată 16 dec. 2024 17:52:53 Scor 0
#include <fstream>
#include <string>

using namespace std;

const int Nmax = 500005;
const int SIGMA = 20;

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

int n, sigma;
long long sol;
int cate[(1 << SIGMA)], numar_masti[(1 << SIGMA)];

void citire(){
    int mask;
    string nume;

    cin >> n;

    sigma = 0;
    for(int i = 1; i <= n; i++){
        cin >> nume;

        mask = 0;
        for(char c : nume){
            mask |= (1 << (c - 'a'));
            sigma = max(sigma, c - 'a' + 1);
        }

        cate[mask]++;
        numar_masti[mask]++;
    }
}

void calculare_numar_masti(){
    for(int bit = 0; bit < sigma; bit++){
        for(int mask = 0; mask < (1 << sigma); mask++){
            if(mask & (1 << bit)){
                numar_masti[mask] += numar_masti[(mask ^ (1 << bit))];
            }
        }
    }
}

void calculare_solutie(){
    sol = 1LL * n * (n - 1);

    for(int mask = 0, rest = (1 << sigma) - 1; mask < (1 << sigma); mask++, rest--){
        sol -= 1LL * cate[mask] * numar_masti[rest];
    }

    sol /= 2;
}

void afisare_solutie(){
    cout << sol;
}

int main(){
    citire();

    calculare_numar_masti();
    calculare_solutie();

    afisare_solutie();

    return 0;
}