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