Cod sursa(job #2589397)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 26 martie 2020 12:01:40
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("bool.in");
ofstream fout ("bool.out");
char sir[1025],stiva[1005],c;int last,stiva1[1005],last1,v[305],n,nr,nr1,q;
int main () {
	fin.getline(sir+1,1015);fin>>q;++q;n=strlen(sir+1);
	while(--q) {
		fin>>c;last=0;last1=0;
		while(c<'A' || c>'Z')
			fin>>c;
		v[(int)c]^=1;
		for(int i=1;i<=n;++i) {
			if(sir[i]==' ')
				continue;
			else if (sir[i]>='A' && sir[i]<='Z') {
				if(sir[i+1]==' ' || sir[i+1]=='(' || sir[i+1]==')')
					stiva1[++last1]=v[(int)sir[i]];
				else {
					if(sir[i]=='N')
						stiva[++last]='~';
					else if (sir[i]=='T')
						stiva1[++last1]=1;
					else if (sir[i]=='F')
						stiva1[++last1]=0;
					else if (sir[i]=='A') {
						while(last>0 && (stiva[last]=='~' || stiva[last]=='&') ) {
							if(stiva[last]=='~')
								stiva1[last1]^=1;
							else if (stiva[last]=='&')
								nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr & nr1);
							--last;
						}
						stiva[++last]='&';
					}
					else if (sir[i]=='O') {
						while(last>0 && (stiva[last]=='~' || stiva[last]=='|' || stiva[last]=='&') ) {
							if(stiva[last]=='~')
								stiva1[last1]^=1;
							else if (stiva[last]=='|')
								nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr | nr1);
							else if (stiva[last]=='&')
								nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr & nr1);
							--last;
						}
						stiva[++last]='|';
					}
					while(sir[i]>='A' && sir[i]<='Z')
						++i;
					--i;
				}
				
			}
			else if(sir[i]=='(')
				stiva[++last]=sir[i];
			else if (sir[i]==')') {
				while(stiva[last]!='(') {
					if(stiva[last]=='~')
						stiva1[last1]^=1;
					else if(stiva[last]=='|')
						nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr | nr1);
					else if (stiva[last]=='&')
						nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr & nr1);
					--last;
				}
				--last;
			}
		}
		while(last>0) {
			if(stiva[last]=='~')
				stiva1[last1]^=1;
			else if(stiva[last]=='&')
				nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr & nr1);
			else if (stiva[last]=='|')
				nr=stiva1[last1],nr1=stiva1[last1-1],last1-=2,stiva1[++last1]=(nr | nr1);
			--last;
		}
		fout<<stiva1[last1];
	}
	return 0;
}