Cod sursa(job #27366)

Utilizator victorsbVictor Rusu victorsb Data 6 martie 2007 12:55:23
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <cstdio>
#include <string.h>

#define Lmax 1024
#define Nmax 128

int n, v[255], pos, l;
char sir[Lmax], s[Nmax];

int evalor();
int evaland();
int evalnor();
int evalnot();

void citire()
{
    gets(sir);
    l = strlen(sir);
    scanf("%d\n", &n);
    scanf("%s\n", s);
}

int evalterm()
{
    int ret;
    if (sir[pos] == ' ')
        ++pos;
    
    if (sir[pos] == '(')
    {
        ++pos;
        ret = evalor();
        ++pos;
    }
    else if (strncmp(sir + pos, "TRUE", 4) == 0)
    {
        ret = 1;
        pos += 4;
    }
    else if (strncmp(sir + pos, "FALSE", 5) == 0)
    {
        ret = 0;
        pos += 5;
    }
    else if ('A' <= sir[pos] && sir[pos] <= 'Z')
    {
        ret = v[sir[pos]];
        pos += 1;
    }
    
    if (sir[pos] == ' ')
        ++pos;
    return ret;
}

int evalnot()
{
    int ret, nt = 0, val;
    if (sir[pos] == ' ')
        ++pos;
    
    if (strncmp(sir + pos, "NOT", 3) == 0)
    {
        nt = 1;
        pos += 3;
        ret = evalnot() ^ nt;
    }
    else
    {
        ret = evalterm() ^ nt;
    }
    
    if (sir[pos] == ' ')
        ++pos;
    return ret;
}

int evaland()
{
    int ret;
    if (sir[pos] == ' ')
        ++pos;
    ret = evalnot();
    
    while (strncmp(sir + pos, "AND", 3) == 0)
    {
        pos += 3;
        if (evalnot() != 1)
            ret = 0;
    }
    
    if (sir[pos] == ' ')
        ++pos;
    return ret;
}

int evalor()
{
    int ret;
    if (sir[pos] == ' ')
        ++pos;
    
    ret = evaland();
    
    while (strncmp(sir + pos, "OR", 2) == 0)
    {
        pos += 2;
        ret |= evaland();
    }
    
    if (sir[pos] == ' ')
        ++pos;
    return ret;
}

void solve()
{
    int i;
    
    for (i = 0; i < n; ++i)
    {
        pos = 0;
        v[s[i]] = !v[s[i]];
        printf("%d", evalor());
    }
}

int main()
{
    freopen("bool.in", "r", stdin);
    freopen("bool.out", "w", stdout);
    citire();
    solve();
    return 0;
}