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
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
#include<iostream>
#include<vector>
#include<string>

const int MAX = 2000000;
using namespace std;
bool wyst[2000000];
vector<int>literaly;
vector<int>tab[100000];
string s,s1,sn;
vector<int>rozklad;
int wartosc[2000000];
void rozl(int x){
    while(x){
        if(x%2==1)
            rozklad.push_back(1);
        else
            rozklad.push_back(0);
        x/=2;
    }
}
bool oblicz(int x){
    int jwp;
    for(int i=1;i<=x;i++){
        jwp=0;
        for(int j=0;j<tab[i].size();j++){
            if(tab[i][j] >MAX){
                jwp= wartosc[tab[i][j]-MAX] xor 1;
            }
            else
                jwp=wartosc[tab[i][j]];
            if(jwp==1)
                break;
        }
        if(jwp != 1)
            break;
    }
    if(jwp==1)
        return true;
    return false;

}
int main(){
    cin.sync_with_stdio(false);
    int n,t,wyn,m,q=0,d;
    char c;

    getline(cin,sn,'\n');
    getline(cin,s1,'\n');

    bool spr=false;
    for(int i=0;i<s1.size();i++){
        c=s1[i];

        if(c=='('){
            spr=true;
            q++;
            continue;
        }

        if(spr){
            if(c!='v'&&c!=')'&&c!=' ')
                s+=c;
            else if (s.size()!=0){
                t=1;
                wyn=0;
                m=0;
                for(int i=s.size()-1;i>=0;i--){
                    if(s[i]=='x'){
                        if(i!=0)
                            m=MAX;
                        break;
                    }
                    else{
                        wyn+=(s[i]-48)*t;
                        t*=10;
                    }
                }
                if(!wyst[wyn]){
                    wyst[wyn]=true;
                    literaly.push_back(wyn);
                }
                tab[q].push_back(wyn+m);
                s.clear();
            }
        }
        if(c==')')
            spr=false;
    }

    n=literaly.size();
    d=1<<n;
    int odp=0;

    for(int i=0;i<d;i++){
        for(int j=1;j<=n;j++)
            wartosc[j]=0;
        rozklad.clear();
        rozl(i);
        for(int j=0;j<rozklad.size();j++)
            wartosc[j+1]=rozklad[j];
        if(oblicz(q)){
            odp++;
        }

    }
    cout << odp;
    return 0;
}