Cod sursa(job #2236241)

Utilizator AlexPop28Pop Alex-Nicolae AlexPop28 Data 28 august 2018 19:59:40
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define fi first
#define se second

using namespace std;

typedef pair <int, int> pii;
typedef vector <int> vi;
typedef long long ll;
typedef unsigned long long ull;

ifstream f ("perle.in");
ofstream g ("perle.out");

bool check (char c, vi &v) {
	int n = v.size();
	stack <char> stk;
	stk.push (c);
	int i = 0;

	while (i < n && !stk.empty()) {
		c = stk.top();
		stk.pop();
		if (c == 'A') {
			++i;
		} else if (c == 'B') {
			if (v[i] == 2) {
				++i;
				stk.push ('B');
			} else if (v[i] == 1 && i + 4 < n && v[i + 2] == 3) {
				i += 4;
				stk.push ('C');
			} else {
				return false;
			}
		} else {
			if (v[i] == 2) {
				++i;
			} else if (v[i] == 1) {
				if (i + 2 < n && v[i + 1] == 2) {
					i += 3;
				} else {
					return false;
				}
			} else {
				if (i + 2 < n) {
					++i;
					stk.push ('C');
					stk.push ('B');
				} else {
					return false;
				}
			}
		}
	}

	if (i < n || !stk.empty()) {
		return false;
	}
	return true;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
#ifdef LOCAL_DEFINE
	freopen (".in", "r", stdin);
#endif
	int q;
	f >> q;
	while (q--) {
		int n;
		f >> n;
		vi v (n);
		for (int i = 0; i < n; ++i) {
			f >> v[i];
		}
		bool ans = 0;
		ans |= check ('A', v);
		ans |= check ('B', v);
		ans |= check ('C', v);

		g << ans << '\n';
	}

	f.close();
	g.close();
	return 0;
}