Cod sursa(job #2399238)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 7 aprilie 2019 10:43:13
Problema Episoade Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

const int DIM = 1005;

char str[DIM];
int pos[DIM];

void solve1(int &it, int &le, int &ri, bool &ok);
void solve2(int &it, int &le, int &ri, bool &ok);
void solve3(int &it, int &le, int &ri, bool &ok);

void solve1(int &it, int &le, int &ri, bool &ok) {
	solve2(it, le, ri, ok);
	vector<pair<int, int>> lst(1, make_pair(le, ri));
	while (str[it] == '#') {
		int le1, ri1; 
		solve2(++it, le1, ri1, ok);
		lst.push_back(make_pair(le1, ri1)); }
	sort(lst.begin(), lst.end());
	le = lst.front().first, ri = lst.back().second;
	for (int i = 1; i < lst.size(); ++i) {
		if (lst[i - 1].second + 1 != lst[i].first) {
			ok = false; } } }

void solve2(int &it, int &le, int &ri, bool &ok) {
	solve3(it, le, ri, ok);
	while (str[it] == '>') {
		int le1, ri1;
		solve3(++it, le1, ri1, ok);
		if (ri + 1 != le1) {
			ok = false; }
		ri = ri1; } }

void solve3(int &it, int &le, int &ri, bool &ok) {
	if (str[it] == '(') {
		solve1(++it, le, ri, ok); ++it; }
	else {
		int v = 0;
		while ('0' <= str[it] and str[it] <= '9') {
			v = v * 10 + (str[it++] - '0'); }
		le = ri = pos[v]; } }

int main(void) {
	freopen("episoade.in", "r", stdin);
	freopen("episoade.out", "w", stdout);
	cin >> str;
	int q, n; cin >> q >> n;	
	while (q--) {
		for (int i = 1; i <= n; ++i) {
			int x; cin >> x; pos[x] = i; }
		int it = 0, le = 0, ri = 0; bool ok = true;
		solve1(it, le, ri, ok); cout << ok << endl; }
	return 0; }