#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);} } |