Cod sursa(job #1825809)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 9 decembrie 2016 18:09:32
Problema Bool Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.41 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream in ("bool.in");
ofstream out ("bool.out");
char line[1010];
int infix[1010] , postfix[1010] , opstack[1010] , val[200];
int infixp = 0 , postfixp = 0 , oppointer = 0;
void chartoinfix(){
  int i = 0;
  while(line[i] != '\0'){
    if(line[i]=='T' && line[i+1]=='R' && line[i+2]=='U' && line[i+3]=='E'){
        infix[infixp] = 1;
        infixp++;
        i+=4;
    } else if(line[i]=='F' && line[i+1]=='A' && line[i+2]=='L' && line[i+3]=='S' && line[i+4]=='E'){
        infix[infixp] = 0;
        infixp++;
        i+=5;
    } else if(line[i] == 'N' && line[i+1] == 'O' && line[i+2] == 'T'){
        infix[infixp] = 4;
        infixp++;
        i+=3;
    } else if(line[i] == 'A' && line[i+1] == 'N' && line[i+2] == 'D'){
        infix[infixp] = 3;
        infixp++;
        i+=3;
    } else if(line[i] == 'O' && line[i+1] == 'R'){
        infix[infixp] = 2;
        infixp++;
        i+=2;
    } else if(line[i]>='A' && line[i]<='Z'){
        infix[infixp] = int(line[i]);
        infixp++;
        i++;
    } else if (line[i]=='('){
        infix[infixp] = -1;
        infixp++;
        i++;
    } else if (line[i]==')'){
        infix[infixp] = -2;
        infixp++;
        i++;
    } else
        i++;
  }
}
void infixtopostfix(){
  for(int i = 0 ; i < infixp ; i++){
    if(infix[i]>='A' || (infix[i] == 0 || infix[i] == 1)){
      postfix[postfixp] = infix[i];
      postfixp++;
    } else if(infix[i] == -1){
        opstack[oppointer] = infix[i];
        oppointer++;
    } else if(infix[i] == -2){
      while(opstack[oppointer - 1] != -1){
        postfix[postfixp] = opstack[oppointer-1];
        oppointer--;
        postfixp++;
      }
      oppointer--;
    }
    else if(infix[i]== 3 || infix[i]== 4){
      while(opstack[oppointer-1] >= infix[i] && oppointer > 0){
        postfix[postfixp]=opstack[oppointer-1];
        oppointer--;
        postfixp++;
      }
      opstack[oppointer] = infix[i];
      oppointer++;
    } else if (infix[i] == 4) {
      opstack[oppointer] = infix[i];
      oppointer++;
    } else {
      postfix[postfixp]=opstack[oppointer-1];
      postfixp++;
    }
  }
  while(oppointer  > 0){
    postfix[postfixp] = opstack[oppointer-1];
    oppointer--;
    postfixp++;
  }
}
int temp[1010],pointer = 0 ,rez[1010] ,rezp;
void eval(){
  rezp = 0;
  ///initiere nou vector
  for(int i = 0 ;i < postfixp ; i++){
    temp[i]=postfix[i];
    if(temp[i] >= 'A')
      temp[i]=val[temp[i]];
  }
  pointer = postfixp;
  ///evaluare in sine
  for(int i = 0 ; i < pointer ; i++){
    if(temp[i] < 2){
      rez[rezp] = temp[i];
      rezp++;
    }
    else{
      if(temp[i] == 4){
        rez[rezp - 1] = 1 - rez[rezp - 1];
      } else if(temp[i] == 3){
        if(rez[rezp - 2] + rez[rezp - 1] == 2)
          rez[rezp - 2] = 1;
        else
          rez[rezp - 2] = 0;
        rezp--;
      } else if(temp[i] == 2){
        if(rez[rezp - 2] + rez[rezp - 1] > 0)
          rez[rezp - 2] = 1;
        else
          rez[rezp - 2] = 0;
        rezp--;
      }
    }
  }
}
int main()
{
  in.getline(line ,1005, '\n');
  chartoinfix();

  infixtopostfix();
  int n;
  char c;
  in>>n;
  //cout<<n;
  for(int j = 0 ; j < n ; j++){
    in>>c;

    val[c]=1-val[c];
    eval();
    out<<rez[0];
    //cout<<":";
  }
  return 0;
}