#include <bits/stdc++.h> using namespace std; int ilosc,wynik; string nazwa; vector <vector <pair <int, bool> > > klauzule; //klauzule --> zmienna, czy negacja vector <string> ciagi; bool rozwaz(string zmienna){ bool X; for (int i=0; i<klauzule.size(); i++){ X=false; for (int j=0; j<klauzule[i].size(); j++){ if ((zmienna[klauzule[i][j].first-1]=='0' && klauzule[i][j].second==true) || (zmienna[klauzule[i][j].first-1]=='1' && klauzule[i][j].second==false)){ X=true; break; } } if (X==false) return false; } return true; } void gen(){ vector <string> X; X.clear(); ciagi.push_back("0"); ciagi.push_back("1"); for (int i=1; i<ilosc; i++){ for (int j=0; j<ciagi.size(); j++){ X.push_back(ciagi[j]+'0'); X.push_back(ciagi[j]+'1'); } ciagi=X; X.clear(); } } void rozbij(string zmienna){ vector <pair <int, bool> > wektor; wektor.clear(); int liczba; bool neg=false; for (int i=0; i<zmienna.length(); i++){ if (zmienna[i]=='~') neg=true; liczba=0; while (zmienna[i]>='0' && zmienna[i]<='9'){ liczba*=10; liczba+=(zmienna[i]-'0'); i++; if (i>=zmienna.length()) break; } if (liczba!=0){ wektor.push_back(make_pair(liczba, neg)); neg=false; } } klauzule.push_back(wektor); } void znajdz(){ bool prawda=false; string zmienna=""; for (int i=0; i<nazwa.length(); i++){ if (prawda==true && nazwa[i]!=')') zmienna+=nazwa[i]; if (nazwa[i]=='(') prawda=true; if (nazwa[i]==')'){ prawda=false; rozbij(zmienna); zmienna=""; } } } int main(){ cin>>ilosc; getline(cin, nazwa); getline(cin, nazwa); gen(); znajdz(); for (int i=0; i<ciagi.size(); i++) if (rozwaz(ciagi[i])==true) wynik++; cout<<wynik; 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 | #include <bits/stdc++.h> using namespace std; int ilosc,wynik; string nazwa; vector <vector <pair <int, bool> > > klauzule; //klauzule --> zmienna, czy negacja vector <string> ciagi; bool rozwaz(string zmienna){ bool X; for (int i=0; i<klauzule.size(); i++){ X=false; for (int j=0; j<klauzule[i].size(); j++){ if ((zmienna[klauzule[i][j].first-1]=='0' && klauzule[i][j].second==true) || (zmienna[klauzule[i][j].first-1]=='1' && klauzule[i][j].second==false)){ X=true; break; } } if (X==false) return false; } return true; } void gen(){ vector <string> X; X.clear(); ciagi.push_back("0"); ciagi.push_back("1"); for (int i=1; i<ilosc; i++){ for (int j=0; j<ciagi.size(); j++){ X.push_back(ciagi[j]+'0'); X.push_back(ciagi[j]+'1'); } ciagi=X; X.clear(); } } void rozbij(string zmienna){ vector <pair <int, bool> > wektor; wektor.clear(); int liczba; bool neg=false; for (int i=0; i<zmienna.length(); i++){ if (zmienna[i]=='~') neg=true; liczba=0; while (zmienna[i]>='0' && zmienna[i]<='9'){ liczba*=10; liczba+=(zmienna[i]-'0'); i++; if (i>=zmienna.length()) break; } if (liczba!=0){ wektor.push_back(make_pair(liczba, neg)); neg=false; } } klauzule.push_back(wektor); } void znajdz(){ bool prawda=false; string zmienna=""; for (int i=0; i<nazwa.length(); i++){ if (prawda==true && nazwa[i]!=')') zmienna+=nazwa[i]; if (nazwa[i]=='(') prawda=true; if (nazwa[i]==')'){ prawda=false; rozbij(zmienna); zmienna=""; } } } int main(){ cin>>ilosc; getline(cin, nazwa); getline(cin, nazwa); gen(); znajdz(); for (int i=0; i<ciagi.size(); i++) if (rozwaz(ciagi[i])==true) wynik++; cout<<wynik; return 0; } |