Cod sursa(job #1758856)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 17 septembrie 2016 23:28:00
Problema Episoade Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin("episoade.in");
ofstream cout("episoade.out");

const int MAXL = 1000;
const int MAXN = 100;

char s[MAXL + 1];
int when[1 + MAXN];

int pointer;
bool ok;

pair<int, int> Parse(int priority) {
    if (priority == 0) {
        vector<pair<int, int> > v;
        v.push_back(Parse(1));
        while (s[pointer] == '#') {
            pointer++;
            v.push_back(Parse(1));
        }
        sort(v.begin(), v.end());
        pair<int, int> answer = v[0];
        for (int i = 1; i < v.size(); i++)
            if (v[i - 1].second + 1 != v[i].first)
                ok = false;
            else
                answer.second = v[i].second;
        return answer;
    }
    if (priority == 1) {
        pair<int, int> answer, next;
        answer = Parse(2);
        while (s[pointer] == '>') {
            pointer++;
            next = Parse(2);
            if (answer.second + 1 != next.first)
                ok = false;
            answer.second = next.second;
        }
        return answer;
    }
    if (s[pointer] == '(') {
        pointer++;
        pair<int, int> answer = Parse(0);
        pointer++;
        return answer;
    }
    int answer = 0;
    while (s[pointer] >= '0' && s[pointer] <= '9') {
        answer = answer * 10 + s[pointer] - '0';
        pointer++;
    }
    return make_pair(when[answer], when[answer]);
}

int main() {
    cin >> s;
    int tests, n;
    cin >> tests >> n;
    for (int test = 1; test <= tests; test++) {
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            when[x] = i;
        }
        pointer = 0;
        ok = true;
        Parse(0);
        if (ok)
            cout << "1\n";
        else
            cout << "0\n";
    }
    return 0;
}