Cod sursa(job #1811575)

Utilizator DobosDobos Paul Dobos Data 21 noiembrie 2016 12:40:30
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <bits/stdc++.h>

#define NMAX 105
#define CMAX 28

using namespace std;

ifstream fin("logic.in");
ofstream fout("logic.out");

string S[NMAX];

int A[CMAX],B[CMAX],V[NMAX];
bitset < CMAX > v;
bool Calcul(int n,int &p,int a);
bool Not(int n,int &p,int a);
bool Val(int n,int &p,int a);

int Tr(char x){
    return x - 'a' + 1;
}


inline bool Descompune(int n,int m,int &N){

    int a = 0,b = 0;

    for(int i = 1; i <= 26; i++)
        A[i] = B[i] = 0;

    for(int j = 0; j < S[n].size(); j++)
            if(S[n][j] >= 'a' && S[n][j] <= 'z'&& A[Tr(S[n][j])] == 0)
                A[Tr(S[n][j])] = ++a;

    for(int j = 0; j < S[m].size(); j++){
        if(S[m][j] >= 'a' && S[m][j] <= 'z' && B[Tr(S[m][j])] == 0)
            B[Tr(S[m][j])] = ++b;
    }


    for(int i = 1; i <= 26; i++){

        if((!A[i] && B[i]) || (!B[i] && A[i])){
            for(int j = 1; j <= 26; j++)
                A[j] = B[j] = 0;
            return 0;
        }
        if(A[i])
            N++;
    }
    return 1;
}

bool Val(int n,int &p,int a){
    bool x = 0;
    if(S[n][p] == '('){
        x = Calcul(n,++p,a);
        p++;
    }
    if(S[n][p] >= 'a' && S[n][p] <= 'z'){
        if(a == 1)
            x = V[A[Tr(S[n][p++])]];
        else
            x = V[B[Tr(S[n][p++])]];
    }
    return x;
}


bool Not(int n,int &p,int a){
    bool x = Val(n,p,a);
    while(S[n][p] == '~')
        x = !Val(n,++p,a);
    return x;
}


bool Calcul(int n,int &p,int a){

    bool x = Not(n,p,a);

    while(S[n][p] == '&' || S[n][p] == '|' || S[n][p] == '^'){
        if(S[n][p] == '&')
            x = x & Not(n,++p,a);
        if(S[n][p] == '|')
            x = x | Not(n,++p,a);
        if(S[n][p] == '^')
            x = x ^ Not(n,++p,a);

    }

    return x;
}



bool Bkt(int k,int n,int N,int M){

    if(v[1]){
        for(int i = 1; i <= k; i++)
            V[v[i]] = 1;
        int p;
        if(Calcul(N,p = 0,1) != Calcul(M,p = 0,2))
            return 0;
    }

    for(int i = v[k] + 1; i <= n; i ++){

        v[k + 1] = i;
        if(!Bkt(k + 1,n,N,M))
            return 0;

    }

}



int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);

    int n,N;

    fin >> n;

    for(int i = 1; i <= 2 * n; i += 2){
        fin >> S[i] >> S[i + 1];
    }
     for(int i = 1; i <= 2 * n; i += 2){
        N = 0;
        if(!Descompune(i,i + 1,N)){
            fout << "diferite" << "\n";
        } else {
            for(int i = 1; i <= 11; i++)
                V[i] = 0;
            if(Bkt(0,N,i,i+ 1))
                fout << "egale" << "\n";
            else
                fout << "diferite" << "\n";

        }

     }

    return 0;
}