Cod sursa(job #873514)
Utilizator | Data | 7 februarie 2013 12:23:39 | |
---|---|---|---|
Problema | Bool | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.45 kb |
#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
int k,to,i,n,gr[300],t,no,m,nr[2000];
bool fk[2000],v[400];
char s[2000],ex[2000],c;
stack <char> st;
int main ()
{
freopen ("bool.in","r",stdin);
freopen ("bool.out","w",stdout);
v['t']=1;
gr['o']=1;
gr['a']=1;
gr['n']=2;
gets(s+1);
s[0]='(';
n=strlen(s);
s[n]=')';
for(i=0;i<=n;++i)
{
if(s[i]==' ')
continue;
if(s[i]=='(')
{
st.push(s[i]);
++k;
}
else
if((s[i]<='Z'&&s[i]>='A')&&(s[i+1]==' '||s[i+1]==')'))
{
ex[++t]=s[i];
if(no)
{
v[s[i]]=1-v[s[i]];
no=!no;
nr[k]--;
}
}
else
{
if(s[i]=='O')
{
if(no)
c='a';
else
c='o';
while(!st.empty()&&st.top()!='('&&gr[st.top()]>=gr[c])
{
ex[++t]=st.top();
st.pop();
}
st.push(c);
i++;
}
else
if(s[i]=='A')
{
if(no)
c='o';
else
c='a';
while(!st.empty()&&st.top()!='('&&gr[st.top()]>=gr[c])
{
ex[++t]=st.top();
st.pop();
}
st.push(c);
i+=2;
}
else
if(s[i]=='N')
{
++nr[k];
no=!no;
i+=2;
}
else
if(s[i]=='T')
{
if(no)
c=='f';
else
c='t';
ex[++t]=c;
i+=3;
}
else
if(s[i]=='F')
{
if(no)
c='t';
else
c='f';
ex[++t]=c;
i+=4;
}
else
{
while(!st.empty()&&st.top()!='(')
{
ex[++t]=st.top();
st.pop();
}
st.pop();
--k;
no=nr[k]%2;
}
}
}
while(!st.empty()&&st.top()!='('&&gr[st.top()]>=gr[c])
{
ex[++t]=st.top();
st.pop();
}
scanf("%d\n",&m);
scanf("%s",s);
for(i=0;i<m;++i)
{
v[s[i]]=!v[s[i]];
for(k=1;k<=t;++k)
{
if((ex[k]>='A'&&ex[k]<='Z')||(ex[k]=='t'||ex[k]=='f'))
{
fk[++to]=v[ex[k]];
}
else
{
switch(ex[k])
{
case 'o': fk[to-1]=fk[to]||fk[to-1]; break;
case 'a': fk[to-1]=fk[to]&&fk[to-1]; break;
}
--to;
}
}
printf("%d",fk[1]);
--to;
}
return 0;
}