# License Key Generator 2

**URL:** <https://forum.olinfo.it/t/license-key-generator-2/9651>\
**Category:** Chiarimenti\
**Created:** [23 Giugno 2025, 1:46pm UTC](https://forum.olinfo.it/t/license-key-generator-2/9651 "2025-06-23T13:46:14Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![v.bizzarri](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/v/7c8e57/32.png) [@v.bizzarri](https://forum.olinfo.it/u/v.bizzarri)\
**Post date:** [23 Giugno 2025, 1:46pm UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/1 "2025-06-23T13:46:14Z")

</div>

Questo codice fa 0 punti sbagliando anche 6 dei 7 test case di esempio.  
Ma in locale mi da risultati giusti.  
Mi sembra strano che, una volta inviato, sbagli anche quelli di esempio.

```auto

#include <string>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
int clausole;
int lettere;
int pot2[28];
vector<long long>coppie;
vector<int>escluse;
vector<int>seq,temp;
int trovate = 0;
void Calcola(int);

void Compatta1(int qt) {
    int i, k;
    int dup = 1;
    for (i = 1, k = 0; i < qt; i++) {
        if (coppie[i] == coppie[k]) {
            dup++;
        }
        else {
            if (dup & 1) {
                k++;
            }
            coppie[k] = coppie[i];
            dup = 1;
        }
    }
    k++;
    if (dup & 1)
        coppie.resize(k);
    else
        coppie.resize(k - 1);
}
int Togli1() {
    int i = 0, j = 0;
    int reg = (int)coppie.size();
    for (i = 0; i < reg; i++) {
        if (!escluse[i]) {
            coppie[j++] = coppie[i];
        }
    }
    coppie.resize(j);
    return j;
}
int solve(int K, string S) {
    lettere = K;
    int N = (int)S.size();
    int i;
    pot2[0] = 1;
    for (i = 1; i <= K; i++) {
        pot2[i] = 2 * pot2[i - 1];
    }
    for (i = 0; i < N; i++) {
        if (S[i] == '(')
            clausole++;
    }
    int valori = pot2[K];
    seq.resize(valori, 0);
    
    temp.resize(valori, 0);
    escluse.resize(clausole);
    coppie.resize(clausole);
    int datogliere = 0;
    int ok = 0;
    int pos,nc=0,bit;
    int presenti[26];
    long long regola, maschera;
    memset(presenti, 0, sizeof(presenti));
    int dabuttare = 0;
    int neg = 0, reg = 0;
    for (i = 0; i < N; i++) {
            
        if (S[i] == '^' || S[i] == '&' || S[i] == '(')
            continue;
        if (S[i] == ')') {
            if (!datogliere) {
                regola = 0;
                maschera = 0;
                int y = 0;
                //rules[reg].resize(nc);
                for (int x = 0; x < K; x++) {
                    bit = pot2[x];
                    switch (presenti[x]) {
                    case 0:
                        break;
                    case 1:
                        regola |= bit;
                        maschera |= bit;
                        //rules[reg][y++] = x + 'a';
                        break;
                    case 2:
                        maschera |= bit;
                        //rules[reg][y++] = x + 'A';
                        break;
                    }
                    if (y == nc)
                        break;
                }
                coppie[reg] = regola + (maschera << 32);
            }
            else {
                dabuttare++;
                datogliere = 0;
                escluse[reg] = 1;
            }
            reg++;
            memset(presenti, 0, sizeof(presenti));
            nc=0;
            continue;
        }
        if (S[i] == '!') {
            neg = 1;
            continue;
        }
        if (S[i] >= 'a' && S[i] <= 'z') {
            pos = S[i] - 'a';
            if (!presenti[pos]) {
                nc++;
                if (neg) {
                    //rules[reg].push_back(S[i] - 32);
                    presenti[pos] = 2;
                }
                else {
                    //rules[reg].push_back(S[i]);
                    presenti[pos] = 1;
                }                    
            }
            else {
                if (presenti[pos] == 1 && neg == 1)
                    datogliere = 1;
                if (presenti[pos] == 2 && neg == 0)
                    datogliere = 1;
            }
            neg = 0;
        }
    }
    if(dabuttare)
        clausole = Togli1();
    sort(coppie.begin(), coppie.end());
    Compatta1(clausole);
    clausole = (int)coppie.size();

    for (i = 0; i < clausole; i++) {
        Calcola(i);
    }
    for (i = 0; i < pot2[K]; i++) {
        if ((seq[i] & 1))
            trovate++;
    }
    
    return trovate;
}

void Calcola(int id ) {
    unsigned int base = (coppie[id] & 0xffffffff); //regole[0][id];
    unsigned int mk = (coppie[id]>>32); // masks[id];
    int i, j,ix,j1;
    int bit = 1;
    int prima = 1;
    j = 0;
    for (bit = 0; bit< lettere; bit++) {
        if ((mk & pot2[bit])==0) {
            if (prima) {
                prima = 0;
                temp[j++] = base;
                temp[j++] = base + pot2[bit];
            }
            else {
                j1 = j;
                for (ix = 0; ix < j; ix++) {
                    temp[j1++]=temp[ix]+ pot2[bit];
                }
                j = j1;
            }
        }
    }
    for (i = 0; i < j; i++) {
        seq[temp[i]]++;
    }
}

```

---

<div class="post-metadata">

**Author:** ![D\_Dario](https://forum.olinfo.it/user_avatar/forum.olinfo.it/d_dario/32/2015_2.png) [@D\_Dario](https://forum.olinfo.it/u/D_Dario)\
**Post date:** [18 Luglio 2025, 8:25am UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/2 "2025-07-18T08:25:10Z")

</div>

In effetti sembra che i testcase siano sbagliati. Per verificarlo ho inviato una serie di codici da cui risulta che:

- i testcase d’esempio considerano corretto l’output descritto nel testo (basta inviare `return i` per i in `{2, 6, 8, 12, 16}`);
- `N` e `K` coincidono con quelli descritti nel testo

> **codice**
>
> ```auto
> #include <string>
> #include <cassert>
> using namespace std;
> 
> int solve(int K, string S) {
> switch (100*K + S.size()) {
> case 419: return 6;
> case 404: return 8;
> case 426: return 8;
> case 510: return 16;
> case 521: return 12;
> case 533: return 12;
> case 222: return 2;
> }
> }
> 
> ```

- ma la stringa `S` NON è quella presente negli esempi forniti

> **codice**
>
> ```auto
> #include <string>
> #include <cassert>
> using namespace std;
> 
> int solve(int K, string S) {
> switch (100*K + S.size()) {
> case 419: assert(S=="(c&d)^(!a&b&!c)^(b)"); return 6;
> case 404: assert(S=="(!a)"); return 8;
> case 426: assert(S=="(!c&!d)^(!a&c&!d)^(a&!b&c)"); return 8;
> case 510: assert(S=="(d)^(!b&e)"); return 16;
> case 521: assert(S=="(b&d)^(b&!e)^(c&!d&e)"); return 12;
> case 533: assert(S=="(b&!c&d&e)^(!a&d)^(!b&c)^(c&d&!e)"); return 12;
> case 222: assert(S=="(a&!a)^(b&b)^(b&b)^(a)"); return 2;
> }
> }
> 
> ```
> 
> dà `Execution killed` mentre sostituendo `==` con `!=` dà corretto il primo subtask.

- ed inoltre `S` non rispetta l’assunzione che tutti i suoi caratteri sono `()&!^` o una lettera dell’alfabeto, _in nessun subtask_, non solo per gli esempi

> **codice**
>
> ```auto
> #include <string>
> #include <cassert>
> using namespace std;
> 
> int solve(int K, string S) {
> assert(S.size() < 100);
> for (int i=0; i<S.size(); i++) {
> char c=S[i];
> bool alpsym = c=='('||c==')'||c=='&'||c=='^'||c=='!'||(c>='a'&& c<='z');
> assert(alpsym);
> }
> switch (100*K + S.size()) {
> case 419: return 6;
> case 404: return 8;
> case 426: return 8;
> case 510: return 16;
> case 521: return 12;
> case 533: return 12;
> case 222: return 2;
> }
> return 0;
> }
> 
> ```
> 
> dà `Execution killed` a tutti i testcase.

Mentre scrivevo questo messaggio ho pensato che forse sbirciando nel [repo github di training](https://github.com/olimpiadi-informatica/cmsocial) si potrebbe capire il percorso dei file di input _durante la compilazione_ e poi mettere qualcosa tipo `#include "input0.txt"` e forse dà un errore di compilazione che contiene l’input. O forse no. Comunque ho messo nei riquadri espandibili il codice che ho usato, se qualcuno vuole riprovare.

---

<div class="post-metadata">

**Author:** ![v.bizzarri](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/v/7c8e57/32.png) [@v.bizzarri](https://forum.olinfo.it/u/v.bizzarri)\
**Post date:** [18 Luglio 2025, 9:03am UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/3 "2025-07-18T09:03:01Z")

</div>

GRAZIE per l’analisi approfondita ed il tempo che hai dedicato.  
Proverò a rivedere il codice eliminando dalla stringa i caratteri che non avrebbero dovuto esserci.  
Stando così le cose direi che chi ha pubblicato il problema dovrebbe ricontrollare qualcosa nei file di input dei test case.

---

<div class="post-metadata">

**Author:** ![fve5](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fve5/32/3229_2.png) [@fve5](https://forum.olinfo.it/u/fve5)\
**Post date:** [18 Luglio 2025, 9:37am UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/4 "2025-07-18T09:37:49Z")

</div>

Il problema non è nei casi di input, ma nel grader che legge male la stringa (in particolare esclude l’ultimo carattere e mette all’inizio un carattere a capo).  
Purtroppo tutte le soluzione che ho scritto erano resilienti a questo errore e quindi non me ne sono reso conto. Appena riesco correggo, scusate e grazie per la segnalazione

---

<div class="post-metadata">

**Author:** ![fve5](https://forum.olinfo.it/user_avatar/forum.olinfo.it/fve5/32/3229_2.png) [@fve5](https://forum.olinfo.it/u/fve5)\
**Post date:** [18 Luglio 2025, 11:12am UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/5 "2025-07-18T11:12:54Z")

</div>

Dovrei aver risolto

---

<div class="post-metadata">

**Author:** ![D\_Dario](https://forum.olinfo.it/user_avatar/forum.olinfo.it/d_dario/32/2015_2.png) [@D\_Dario](https://forum.olinfo.it/u/D_Dario)\
**Post date:** [18 Luglio 2025, 2:32pm UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/6 "2025-07-18T14:32:47Z")

</div>

No aspetta ma quindi l’unica persona che l’ha risolto sei tu, che sei anche l’autore?

> [@fve5](#):
>
> Purtroppo tutte le soluzione che ho scritto erano resilienti a questo errore

Perché l’ultimo carattere è sempre `)`, quindi non perdi informazioni?

> [@fve5](#):
>
> Dovrei aver risolto

In effetti per i testcase d’esempio adesso funziona ma per gli altri subtask continua a dare `Execution killed` con il test dei caratteri presenti (terzo del mio primo messaggio).  
Già che ci sei potresti aggiungere qualcosa per togliere il messaggio del compilatore `warn_unused_result` sulla lettura dell’input?  
Grazie dell’impegno

---

<div class="post-metadata">

**Author:** ![MatteoArcari](https://forum.olinfo.it/user_avatar/forum.olinfo.it/matteoarcari/32/1976_2.png) [@MatteoArcari](https://forum.olinfo.it/u/MatteoArcari)\
**Post date:** [18 Luglio 2025, 11:29pm UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/7 "2025-07-18T23:29:01Z")

</div>

Stai assertando anche che la stringa sia lunga al più 100 caratteri, il che può essere falso sulla base assuzioni del problema.

---

<div class="post-metadata">

**Author:** ![D\_Dario](https://forum.olinfo.it/user_avatar/forum.olinfo.it/d_dario/32/2015_2.png) [@D\_Dario](https://forum.olinfo.it/u/D_Dario)\
**Post date:** [18 Luglio 2025, 11:38pm UTC](https://forum.olinfo.it/t/license-key-generator-2/9651/8 "2025-07-18T23:38:51Z")

</div>

O cielo hai ragione non me ne ero proprio accorto.😐  
Così mi imparo a fare copia e incolla del codice.  
Grazie mille della correzione.
