Cod sursa(job #2740110)

Utilizator alextameralex el alextamer Data 11 aprilie 2021 15:10:27
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cctype>
using namespace std;
ifstream in("test.in");
ofstream out("test.out");

int atomi_total_A, atomi_total_B;
char c[260];

// tre sa fac pt mai multe paranteze de odata

pair<int, int> calculator(char c[], int n) {
    int i, atomi_A = 0, atomi_B = 0, nr_curent = 0, atom = 1; // nr_curent e valoarea curenta, daca atom e 1 atunci trebuie sa-i dau lui A, daca e 2 ii dau lui B 
    for (i = 0; i < n; i++) {
        // mereu c[i] e A, B, un numar, sau paranteza 
        if (c[i] == 'A')
            atom = 1;
        if (c[i] == 'B')
            atom = 2;
        if (isdigit(c[i])) {
            while (i < n && isdigit(c[i])) {
                nr_curent = nr_curent * 10 + (c[i] - '0');
                i++;
            }
            i--;
            if (atom == 1) {
                atomi_A += nr_curent;
                nr_curent = 0;
            }
            else {
                atomi_B += nr_curent;
                nr_curent = 0;
            }
        }
        if (c[i] == '(') { // eu practic vreau sa bag tot ce e in paranteza iar in toata functia asta, pana dau de ceva fara paranteze
            int paranteza = 0; // daca am mai multe paranteze in acelasi timp
            int indice = i; // sa stiu unde a inceput totul
            char aux[256];
            int indice_temp = 0; // indice pentru aux
            while ((i < n && c[i] != ')') || paranteza != 1) {
                if (c[i] == '(')
                    paranteza++;
                if (c[i] == ')')
                    paranteza--;
                i++;
            }
            for (int j = indice + 1; j < i; j++) { // copiez in aux ce e intre paranteze
                aux[indice_temp] = c[j];
                indice_temp++;
            }
            //strlen e indice_temp ( gen i<indice_temp)
            i++;
            int valoare_temp = 0; // valoarea dupa paranteze
            while (i < n && isdigit(c[i])) {
                valoare_temp = valoare_temp * 10 + (c[i] - '0');
                i++;
            }
            i--;
            pair<int, int> temporar = calculator(aux, indice_temp);
            atomi_A += temporar.first * valoare_temp;
            atomi_B += temporar.second * valoare_temp;
        }
    }
    pair<int, int> temp; // fac cu pereche si .first e nr de atomi A, .second e nr de atomi B
    temp.first = atomi_A; temp.second = atomi_B;
    return temp;
}

int main() {
    in.getline(c, 256);
    int n = strlen(c);
    pair <int, int > temp = calculator(c, n);
    cout << temp.first << " " << temp.second;
}