Cod sursa(job #3265761)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 2 ianuarie 2025 23:23:58
Problema Perle Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse,avx,fma,avx2,bmi,bmi2,lzcnt,popcnt")

using namespace std;
using ll = long long;
using ld = long double;
class Grammar {
  vector<int> v;

  int was_A(int left) { return left < v.size() ? left + 1 : 0; }

  int was_B(int left) {
    if (left >= v.size())
      return 0;
    if (v[left] == 2)
      return was_B(left + 1);
    if (left + 4 >= v.size())
      return 0;
    if (v[left] == 1 && v[left + 2] == 3)
      return was_C(left + 4);
    return 0;
  }

  bool was_C(int left) {
    if (left >= v.size())
      return 0;
    if (v[left] == 2)
      return left + 1;

    if (v.size() > left + 1 && v[left] == 1 && v[left + 1] == 2)
      return was_A(left + 2);

    if (v[left] != 3)
      return false;

    int curr = was_B(left + 1);
    if (curr == 0)
      return 0;

    return was_C(curr);
  }

public:
  bool check(vector<int> &_v) {
    v = std::move(_v);
    return was_A(0) || was_B(0) || was_C(0);
  }
};

void solve() {
  int n;
  cin >> n;

  vector<int> v(n);
  for (auto &x : v)
    cin >> x;

  Grammar g;
  cout << g.check(v) << '\n';
}

int main() {
  freopen("perle.in", "r", stdin);
  freopen("perle.out", "w", stdout);
  int t = 1;
  cin >> t;
  while (t--)
    solve();

  return 0;
}