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