Maksimalni proizvod dužina nepovezanih reči

Dati su niz reči i potrebno je pronaći maksimalni proizvod dužina dve reči koje nemaju nijedan zajednički karakter. Svaka reč može sadržati mala slova engleske abecede (a do z). Dve reči se smatraju "nepovezanim" ako ne dele nijednu istu slovo u svojoj binarnoj reprezentaciji.

Za svaku kombinaciju dve reči, ako ne dele nijedno slovo, izračunava se proizvod njihovih dužina, a cilj je pronaći maksimalnu vrednost tog proizvoda.

Ako ne postoji nijedna kombinacija reči koje nemaju zajedničkih karaktera, potrebno je vratiti -1 na standardan izlaz za greške.

Ulaz

Izlaz

Primer 1

Ulaz

6
abcw
baz
foo
bar
xtfn
abcdef

Izlaz

16

Primer 2

Ulaz

3
abc
abz
abx

Izlaz

Na stderr ispisujemo:

-1

Rešenje

main.c

#include <stdio.h>

int max_proizvod_duzina(char** reci, int broj_reci){
	int *maske = (int*)malloc(broj_reci * sizeof(int));

	for (int i = 0; i < broj_reci; i++) {
        maske[i] = 0;
        for (int j = 0; reci[i][j] != '\0'; j++) {
            maske[i] |= 1 << (reci[i][j] - 'a');  // Postavljamo odgovarajući bit
        }
    }

	int max_proizvod = -1;
	for (int i = 0; i < broj_reci; i++) {
        for (int j = 0; j < i; j++) {
            if ((maske[i] & maske[j]) == 0) {  // Ako ne dele zajedničke karaktere
                int proizvod = strlen(reci[i]) * strlen(reci[j]);
                if (proizvod > max_proizvod) {
                    max_proizvod = proizvod;  // Ažuriramo maksimalni proizvod
                }
            }
        }
    }

    free(maske);
	return max_proizvod;
}

int main(void)
{
	int n;
    scanf("%d", &n);

    char** words = (char**)malloc(n * sizeof(char*));

    for (int i = 0; i < n; i++) {
        words[i] = (char*)malloc(100 * sizeof(char));  // Pretpostavljamo maksimalnu dužinu reči 100
        scanf("%s", words[i]);
    }

	int rezultat = max_proizvod_duzina(words, n);

	if (rezultat == -1) {
        fprintf(stderr, "-1\n");
    } else {
        printf("%d\n", rezultat);
    }

    for (int i = 0; i < n; i++) {
        free(words[i]);
    }
    free(words);

	return 0;
}