Cod sursa(job #2115643)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 26 ianuarie 2018 22:59:28
Problema Bool Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char a[10000];
int n, b[30], m;

int cautasemn1(int st, int dr)
{
    int nr=0;
    for (int i=dr; i>=st+1; i--)
    {
        if (nr==0 && a[i]=='R' && a[i-1]=='O')
            return i-1;
        if (a[i]==')')
            nr++;
        else
            if (a[i]=='(')
                nr--;
    }
    return -1;
}


int cautasemn2(int st, int dr)
{
    int nr=0;
    for (int i=dr; i>=st+2; i--)
    {
        if (nr==0 && a[i]=='D' && a[i-1]=='N' && a[i-2]=='A')
            return i-2;
        if (a[i]==')')
            nr++;
        else
            if (a[i]=='(')
                nr--;
    }
    return -1;
}

int cautasemn3(int st, int dr)
{
    int nr=0;
    for (int i=dr; i>=st+2; i--)
    {
        if (nr==0 && a[i]=='T' && a[i-1]=='O' && a[i-2]=='N')
            return i-2;
        if (a[i]==')')
            nr++;
        else
            if (a[i]=='(')
                nr--;
    }
    return -1;
}

int valoare(int x)
{
    return b[a[x]-65];
}

int expresie(int st, int dr)
{
    int semn;
    semn=cautasemn1(st, dr);
    if (semn!=-1)
    {
        int e1, e2;
        e1=expresie(st, semn-2);
        e2=expresie(semn+3, dr);
        return e1 || e2;
    }
    semn=cautasemn2(st, dr);
    if (semn!=-1)
    {
        int e1, e2;
        e1=expresie(st, semn-3);
        e2=expresie(semn+4, dr);
        return e1 && e2;
    }
    semn=cautasemn3(st, dr);
    if (semn!=-1)
    {
        int e1;
        e1=expresie(semn+4, dr);
        return !e1;
    }
    if (a[st]=='(' && a[dr]==')')
        return expresie(st+1, dr-1);
    if (a[st]=='T' && a[dr]=='E')
        return 1;
    if (a[st]=='F' && a[dr]=='E')
        return 0;
    return valoare(st);
}

int main()
{
    ifstream fin("bool.in");
    ofstream fout("bool.out");
    fin.getline(a, 10000);
    n=strlen(a);
    fin >> m;
    for (int i=0; i<m; i++)
    {
        char c;
        fin >> c;
        b[c-65]=!b[c-65];
        fout << expresie(0, n-1);
    }
    return 0;
}