Cod sursa(job #2808907)

Utilizator george_buzasGeorge Buzas george_buzas Data 25 noiembrie 2021 17:20:58
Problema Subsecventa de suma maxima Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <stack>
#include <bitset>
using namespace std;

bitset<1000001>bracket_couples_indexes;

void find_coupled_brackets(stack<pair<char, int>> open_brackets, string brackets, int length) {
	for (int i = 0; i < length; ++i) {
		if (brackets[i] == '(' || brackets[i] == '[' || brackets[i] == '{') {
			open_brackets.push(make_pair(brackets[i], i));
		} else if (!open_brackets.empty() && ((brackets[i] == ')' && open_brackets.top().first == '(') || (brackets[i] == ']' && open_brackets.top().first == '[') || (brackets[i] == '}' && open_brackets.top().first == '{'))) {
			bracket_couples_indexes[open_brackets.top().second] = true;
			bracket_couples_indexes[i] = true;
			open_brackets.pop();
		} else {
			while (!open_brackets.empty()) {
				open_brackets.pop();
			}
		}
	}
}

int get_longest_well_formed_seq(int length) {
	int max_length = 0, current_length = 0;
	for (int i = 0; i <= length; ++i) {
		if (bracket_couples_indexes[i]) {
			++current_length;
			if (!bracket_couples_indexes[i + 1]) {
				max_length = max(max_length, current_length);
				current_length = 0;
			}
		}
	}
	return max_length;
}

int main() {
	ifstream fin("paranteze.in");
	ofstream fout("paranteze.out");
	int length;
	string brackets;
	fin >> length >> brackets;
	stack<pair<char, int>> open_brackets;
	find_coupled_brackets(open_brackets, brackets, length);
	fout << get_longest_well_formed_seq(length);
	return 0;
}