Cod sursa(job #541845)

Utilizator alexapoApostol Alexandru Ionut alexapo Data 25 februarie 2011 14:49:20
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<fstream.h>
ifstream f("bool.in");
ofstream g("bool.out");
char s[1005],s1[1005],stiva[1005],pol[1005],sir[1005];
int vf,n,m,var[30],k;
int v[1005];
int prioritate(char c)
{   if(c=='(') return 0;
if(c=='+' ) return 1;
if(c=='_')return 3; 
return 2;
}
void calculeaza()
{
int i;
// evaluarea expresiei
vf=0;
for(i=0;i<k;i++)
switch(pol[i])
{ case '_':v[vf]^=1;break;
case '+':v[vf-1] |= v[vf],vf--;break;
case '*':v[vf-1] &=v[vf],vf--;break;
case '1': v[++vf]=1; break;
case '0': v[++vf]=0; break;
default: v[++vf]=var[pol[i]-'A'];
}
g<<v[1]; 
}
int main()
{ int i;
s[0]='(';
f.getline(s+1,100002);
n=strlen(s);
s[n++]=')';
s[n]='\0';
f>>m;
f.get();
f.getline(sir,1001);
//g<<m<<'\n'<<sir<<'\n';
k=0;
i=0;
while(i<n)
switch(s[i])
{case '(':s1[k++]=s[i++];break;
case ')':s1[k++]=s[i++];break;
case ' ': i++;break;   
case 'N': if(s[i+1]=='O')s1[k++]='_',i=i+3;
else s1[k++]=s[i++];break;
case 'O': if(s[i+1]=='R')s1[k++]='+',i=i+2;
else s1[k++]=s[i++];break;
case 'A': if(s[i+1]=='N')s1[k++]='*',i=i+3;
else s1[k++]=s[i++];break;
case 'T': if(s[i+1]=='R')s1[k++]='1',i=i+4;
else s1[k++]=s[i++];break;
case 'F': if(s[i+1]=='A')s1[k++]='0',i=i+5;
else s1[k++]=s[i++];break;
default:
s1[k++]=s[i++];
}
 
s1[k]=0;
//g<<s<<'\n'<<s1<<'\n' ; 
//cout<<s1<<'\n';
//construiesc forma poloneza
strcpy(s,s1);   
n=strlen(s);
k=-1;
for(i=0;i<n;i++)
{ 
if(s[i]=='(')stiva[++vf]='(';
else
if(s[i]==')')
{ while(stiva[vf]!='(') pol[++k]=stiva[vf--];vf--;}
else    
if(s[i]=='+' || s[i]=='*')
{  while (prioritate(stiva[vf])>=prioritate(s[i])) pol[++k]=stiva[vf--];
stiva[++vf]=s[i];
} 
else if(s[i]=='_') 
{ while (prioritate(stiva[vf])>prioritate(s[i])) pol[++k]=stiva[vf--];
stiva[++vf]=s[i];
}
else pol[++k]=s[i];
}
pol[++k]=0;  
//g<<pol<<'\n';
for(i=0;i<m;i++)
{ var[sir[i]-'A']^=1;
calculeaza();
}
f.close(); g.close();
return 0;
}