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