Cod sursa(job #594498)

Utilizator drywaterLazar Vlad drywater Data 7 iunie 2011 23:14:26
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
// -1 ( -2 & -3 OR -4 NOT
#include <fstream>
#include <string.h>
using namespace std;
char s[1001],s2[101],c;
int n,i,polo[1001],st[1001],l1,v[30],j;
int main(void)
{
    FILE *f=fopen("bool.in","r");
    FILE *o=fopen("bool.out","w");
    fgets(s,1001,f);
    fscanf(f,"%d",&n);
    fscanf(f,"%c",&c);
    fgets(s2,101,f);
    v[29]=0;
    v[28]=1;
    l1=strlen(s);
    for (i=0;i<l1;i++)
    {
        if (s[i]=='N' && s[i+1]=='O') { st[++st[0]]=-4; i+=2; continue;}
        if (s[i]=='A' && s[i+1]=='N') { while (st[st[0]]==-4) {polo[++polo[0]]=st[st[0]]; st[0]--;}st[++st[0]]=-2; i+=2; continue;}
        if (s[i]=='O' && s[i+1]=='R') {while (st[st[0]]==-2 || st[st[0]]==-4) {polo[++polo[0]]=st[st[0]]; st[0]--;} i++; st[++st[0]]=-3; continue;}
        if (s[i]=='T' && s[i+1]=='R') {polo[++polo[0]]=28; i+=3; continue;}
        if (s[i]=='F' && s[i+1]=='A') {polo[++polo[0]]=29; i+=4; continue;}
        if (s[i]>='A' && s[i]<='Z') {polo[++polo[0]]=s[i]-'A'; continue;}
        if (s[i]=='(') st[++st[0]]=-1;
        if (s[i]==')') {while (st[st[0]]!=-1) {polo[++polo[0]]=st[st[0]]; st[0]--;} st[0]--;}
    }
    while (st[0]) {polo[++polo[0]]=st[st[0]]; st[0]--;}
    for (j=0;j<n;j++)
    {
        v[s2[j]-'A']=1-v[s2[j]-'A'];
        for (i=1;i<=polo[0];i++)
        {
            if (polo[i]>=0) st[++st[0]]=v[polo[i]];
            if (polo[i]==-4) {st[st[0]]=1-st[st[0]];}
            if (polo[i]==-2) {if (st[st[0]-1] && st[st[0]]) st[st[0]-1]=1; else st[st[0]-1]=0; st[0]--;}
            if (polo[i]==-3) {if (st[st[0]-1] || st[st[0]]) st[st[0]-1]=1; else st[st[0]-1]=0; st[0]--;}
        }
        fprintf(o,"%d",st[1]);
        st[0]=0;
    }
    return 0;
}