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
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> V;
int S[1000001];
int cur;
int sum;
bool evall(const vector<int> &v) {
	for (const auto &x : v) {
		if ((x > 0) == (((cur >> (S[abs(x)]-1)) & 1) == 1)) {
			return true;
		}
	}
	return false;
}
bool eval() {
	for (const auto &v : V) {
		if (!evall(v))
			return false;
	}
	return true;
}
int main() {
	int n;
	scanf("%d", &n);
	int c;
	V.resize(1);
	bool neg = false;
	int p = 0, pp = 1;
	while ((c=getchar_unlocked()) != EOF) {
		if (c == ')' || c == 'v') {
			V.back().emplace_back((neg?-1:1)*p);
			if (!S[p])
				S[p]=pp++;
			neg=false;
			p=0;
		} else if (c == '^') {
			V.resize(V.size()+1);
		} else if (c >= '0' && c <= '9') {
			p = p * 10 + c - '0';
		} else if (c == '~')
			neg = true;
	}
	pp--;
	for (;cur < (1 << pp); cur++) {
		if (eval())
			sum++;
	}
	printf("%d\n", sum % (1000000007));

}