Cod sursa(job #2273228)

Utilizator giotoPopescu Ioan gioto Data 31 octombrie 2018 10:48:30
Problema Episoade Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, p;
int a[105];
int w[105];
char s[1005];
bool ok;
void eval(int &st, int &dr);
void eval2(int &st, int &dr);
void eval3(int &st, int &dr);
int main()
{
    freopen("episoade.in", "r", stdin);
    freopen("episoade.out", "w", stdout);

    scanf("%s", s + 1);
    scanf("%d%d", &n, &m);

    while(n--){
        for(int i = 1; i <= m ; ++i)
            scanf("%d", &a[i]), w[a[i]] = i;

        p = 1; ok = 1;
        int st, dr;
        eval(st, dr);
        printf("%d\n", ok);
    }

    return 0;
}
void eval(int &st, int &dr){
    if(!ok) return ;
    vector <pair <int, int> > v;
    eval2(st, dr);
    v.push_back({st, dr});
    while(s[p] == '#'){
        int st2 = 0, dr2 = 0;
        ++p;
        eval(st2, dr2);
        v.push_back({st2, dr2});
    }
    sort(v.begin(), v.end());
    st = v[0].first; dr = v[v.size() - 1].second;
    for(int i = 0; i < v.size() - 1; ++i){
        if(v[i].second + 1 != v[i + 1].first){
            ok = 0;
            return ;
        }
    }
}
void eval2(int &st, int &dr){
    if(!ok) return ;
    eval3(st, dr);
    while(s[p] == '>'){
        int st2 = 0, dr2 = 0;
        ++p;
        eval3(st2, dr2);
        if(dr + 1 != st2) {ok = 0; return ;}
        dr = dr2;
    }
}
void eval3(int &st, int &dr){
    if(!ok) return ;
    if(s[p] == '('){
        ++p;
        eval(st, dr);
        ++p;
    }
    if(s[p] >= '0' && s[p] <= '9'){
        int x = 0;
        while(s[p] >= '0' && s[p] <= '9')
            x = x * 10 + s[p++] - '0';
        st = dr = w[x];
    }
}