Cod sursa(job #465022)

Utilizator Marius96Marius Gavrilescu Marius96 Data 22 iunie 2010 22:15:52
Problema Episoade Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.94 kb
/* 
 * File:   Episoade!.cpp
 * Author: marius
 *
 * Created on June 22, 2010, 6:22 PM
 */

#include <stdlib.h>
#include <cstring>
#include <string>
#include <vector>
#include <list>
#include <cstdio>
using namespace std;
int v[100];
vector<int> get(string s){
    vector<int> v;int x=0;bool nr=false;
    for(int i=0;i<s.length();i++)
        if(isdigit(s[i])&&nr==false){
            nr=true;
            x=x*10+s[i]-'0';
        }else if(nr&&!isdigit(s[i])){
            v.push_back(x);
            x=0;
            nr=false;
        }
        return v;
}
bool chkGt(string s1,string s2){
    vector<int> vv=get(s1);int MAX=0,MIN=0;
    for(int i=0;i<vv.size();i++)
        if(v[vv[i]]>MAX)
            MAX=v[vv[i]];
    vv=get(s2);
    MIN=v[vv[0]];
    for(int i=0;i<vv.size();i++)
        if(v[vv[i]]<MIN)
            MIN=v[vv[i]];
    return MAX+1==MIN;
}
bool eval(string s){
    list<string> nr;
    list<bool> op;int l=0,par=0;
    for(int i=0;i<s.length();i++){
        if(s[i]=='(')
            par++;
        else if(s[i]==')'){
            par--;
            if(!par){
                string ss=s.substr(l,i-l+1);
                if(get(ss).size()>1&&!eval(ss.substr(1,ss.size()-2)))
                    return false;
                nr.push_back(ss);
            }
        }
        else if(par)
            continue;
        else{
            op.push_back(s[i]=='>');
            l=i+1;
        }
    }
    int i=0;
    list<string>::iterator it2=nr.begin();
    for(list<bool>::iterator it=op.begin();it!=op.end();it++,i++){
        if(*it){
            string ss=*it2;
            it2=nr.erase(it2);
            if(!chkGt(ss,*it2))
                return false;
            (*it2).append(ss);
        }else
            it2++;
    }
    vector<int> * vv=new vector<int>[nr.size()];
    i=0;
    for(list<string>::iterator it=nr.begin();it!=nr.end();it++,i++)
        vv[i]=get(*it);
    for(i=0;i<nr.size()-1;i++)
        for(int j=i+1;j<nr.size();j++){
            const bool b=v[vv[i][0]]<v[vv[j][0]];
            for(int ii=0;ii<vv[i].size();ii++)
                for(int jj=0;jj<vv[j].size();jj++)
                    if(b!=(v[vv[i][ii]]<v[vv[j][jj]]))
                        return false;
        }
    return true;
}
int main(int argc, char** argv) {
    freopen("episoade.in","r",stdin);
    freopen("episoade.out","w",stdout);
    char * str=new char[105];
    gets(str);int x=strlen(str);int nn=0;
    char * s  =new char[2*x];int st=0;
    for(int i=0;i<x;i++){
        if(st==0&&isdigit(str[i])){
            s[nn++]='(';
            st=1;
        }
        else if(st==1&&!isdigit(str[i])){
            s[nn++]=')';
            st=0;
        }
        s[nn++]=str[i];
    }
    if(st==1)
        s[nn++]=')';
    int n,t;
    scanf("%d%d",&t,&n);
    while(t--){
        for(int i=0;i<n;i++){
            scanf("%d",&x);
            v[x]=i+1;
        }
        if(eval(string(s)))
            printf("1\n");
        else
            printf("0\n");
    }
    return (EXIT_SUCCESS);
}