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