#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define forv(na,it) for(__typeof(na.begin()) it=na.begin(); it!=na.end(); it++)
struct wp {
vector <int> v[2];
}t[1000006];
char s[10000007];
void insert (bool &neg, int &licz, int d)
{
t[d].v[neg].push_back(licz);
neg=false;
licz=0;
}
void view (int i, int neg)
{
printf ("%d : {", neg);
forv (t[i].v[neg], it)
printf ("%d ", *it);
printf ("}\n");
}
int main ()
{
int n;
scanf ("%d", &n); getchar();
fgets (s, 10000000, stdin);
int d=0, licz=0;
bool neg=false;
for (int i=0; s[i]!=0;i++)
{
if (s[i]=='(')
{
d++;
i++;
for (;s[i]!=')';i++)
{
if (s[i]=='~')
neg=true;
else if (s[i]=='x');
else if ('0'<=s[i] && s[i]<='9')
licz=licz*10+(s[i]-48);
else if (s[i]=='v')
insert (neg, licz, d);
}
insert (neg, licz, d);
}
}
int mx=1<<n, a;
bool b[50], wyn;
int wynik=0;
for (int i=0; i<mx; i++)
{
a=i;
for (int j=n; j>0; j--)
{
b[j]=a&1;
a/=2;
}
wynik++;
for (int j=1; j<=d; j++)
{
wyn=false;
//printf ("sprawdzam %d %d\n", i, j);
forv (t[j].v[0], it) wyn=wyn|b[*it];
forv (t[j].v[1], it) wyn=wyn|(!b[*it]);
if (wyn==false)
{
//printf ("zle %d %d %d\n", i, j);
wynik--;
break;
}
}
}
printf ("%d", wynik);
//for (int i=1; i<=d; i++){view(i, 0);view(i, 1);}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; #define forv(na,it) for(__typeof(na.begin()) it=na.begin(); it!=na.end(); it++) struct wp { vector <int> v[2]; }t[1000006]; char s[10000007]; void insert (bool &neg, int &licz, int d) { t[d].v[neg].push_back(licz); neg=false; licz=0; } void view (int i, int neg) { printf ("%d : {", neg); forv (t[i].v[neg], it) printf ("%d ", *it); printf ("}\n"); } int main () { int n; scanf ("%d", &n); getchar(); fgets (s, 10000000, stdin); int d=0, licz=0; bool neg=false; for (int i=0; s[i]!=0;i++) { if (s[i]=='(') { d++; i++; for (;s[i]!=')';i++) { if (s[i]=='~') neg=true; else if (s[i]=='x'); else if ('0'<=s[i] && s[i]<='9') licz=licz*10+(s[i]-48); else if (s[i]=='v') insert (neg, licz, d); } insert (neg, licz, d); } } int mx=1<<n, a; bool b[50], wyn; int wynik=0; for (int i=0; i<mx; i++) { a=i; for (int j=n; j>0; j--) { b[j]=a&1; a/=2; } wynik++; for (int j=1; j<=d; j++) { wyn=false; //printf ("sprawdzam %d %d\n", i, j); forv (t[j].v[0], it) wyn=wyn|b[*it]; forv (t[j].v[1], it) wyn=wyn|(!b[*it]); if (wyn==false) { //printf ("zle %d %d %d\n", i, j); wynik--; break; } } } printf ("%d", wynik); //for (int i=1; i<=d; i++){view(i, 0);view(i, 1);} } |
English