Cod sursa(job #2740317)

Utilizator alextameralex el alextamer Data 12 aprilie 2021 16:24:08
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <iostream>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cctype>
using namespace std;

long long atomi_total_A, atomi_total_B;
char c[260];

// tre sa fac pt mai multe paranteze de odata
int cifra(char c) {
	if (0 <= c - '0' && c - '0' <= 9)
		return c - '0';
	return -1;
}

pair<long long, long long> calculator(char c[], long long n) {
	long long 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 
	int i;
	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 (cifra(c[i]) > -1) {
			while (i < n && cifra(c[i]) > -1) {
				nr_curent = nr_curent * 10 + cifra(c[i]);
				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 long longre paranteze
				aux[indice_temp] = c[j];
				indice_temp++;
			}
			//strlen e indice_temp ( gen i<indice_temp)
			i++;
			long long valoare_temp = 0; // valoarea dupa paranteze
			while (i < n && cifra(c[i])> -1) {
				valoare_temp = valoare_temp * 10 + cifra(c[i]);
				i++;
			}
			i--;
			pair<long long, long long> temporar = calculator(aux, indice_temp);
			atomi_A += temporar.first * valoare_temp;
			atomi_B += temporar.second * valoare_temp;
		}
	}
	pair<long long, long long> 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() {
	cin.getline(c, 256);
	long long n = strlen(c);
	pair <long long, long long > temp = calculator(c, n);
	cout << temp.first << " " << temp.second;
}