License Key Generator 2

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.


#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]]++;
    }
}