Pagini recente » Statistici Maris Razvan-Alexandru (UTCNR_Maris_Razvan) | Istoria paginii utilizator/oprescas | Cod sursa (job #1961614) | Cod sursa (job #892798) | Cod sursa (job #291235)
Cod sursa(job #291235)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int maxS = 1020;
const int maxN = 102;
int poz, len;
char s[maxS];
char A[maxN][maxN];
int V[maxN], Poz[maxN];
bool ok;
vector<int> expr();
vector<int> termen();
vector<int> factor();
vector<int> factor(){
vector<int> r1;
if (s[poz] == '('){
++ poz;
r1 = expr();
++ poz;
return r1;
}
int aux = 0;
while (poz < len && s[poz] >= '0' && s[poz] <= '9')
aux = aux * 10 + s[poz ++] - '0';
r1.push_back(aux);
return r1;
}
vector<int> termen(){
vector<int> r1, r2;
int i, j;
r1 = factor();
if (ok == false)
return r1;
while (poz < len && s[poz] == '>'){
++poz;
r2 = factor();
if (ok == false)
return r1;
for (i = 0; i < r1.size(); ++i)
for (j = 0; j < r2.size(); ++j){
A[r1[i]][r2[j]] = 1;
A[r2[j]][r1[i]] = 2;
if (Poz[r1[i]] > Poz[r2[j]]){
//fprintf(stderr, "%d %d\n", r1[i], r2[j]);
ok = false;
return r1;
}
}
for (j = 0; j < r2.size(); ++j)
r1.push_back(r2[j]);
}
return r1;
}
vector<int> expr(){
vector <int> r1, r2;
vector<pair<int, int> > AB;
int i, j, minim, maxim;
r1 = termen();
if (ok == false)
return r1;
minim = Poz[r1[0]]; maxim = Poz[r1[0]];
for (i = 1; i < r1.size(); ++i){
if (Poz[r1[i]] > maxim)
maxim = Poz[r1[i]];
if (Poz[r1[i]] < minim)
minim = Poz[r1[i]];
}
AB.push_back(make_pair(minim, maxim));
while (poz < len && s[poz] == '#'){
++poz;
r2 = termen();
if (ok == false)
return r1;
for (i = 0; i < r1.size(); ++i)
for (j = 0; j < r2.size(); ++j)
A[r1[i]][r2[j]] = A[r2[j]][r1[i]] = 3;
for (i = 0; i < AB.size(); ++i)
for (j = 0; j < r2.size(); ++j)
if (Poz[r2[j]] <= AB[i].second && Poz[r2[j]] >= AB[i].first){
ok = false;
return r1;
}
minim = Poz[r2[0]]; maxim = Poz[r2[0]];
for (i = 1; i < r2.size(); ++i){
if (Poz[r2[i]] > maxim)
maxim = Poz[r2[i]];
if (Poz[r2[i]] < minim)
minim = Poz[r2[i]];
}
//fprintf(stderr, "%d %d\n", minim, maxim);
for (i = 0; i < r1.size(); ++i)
if (Poz[r1[i]] <= maxim && Poz[r1[i]] >= minim){
ok = false;
return r1;
}
for (j = 0; j < r2.size(); ++j)
r1.push_back(r2[j]);
AB.push_back(make_pair(minim, maxim));
}
return r1;
}
int main(){
int N, t, i, j;
freopen("episoade.in", "r", stdin);
freopen("episoade.out", "w", stdout);
gets(s);
poz = 0; len = strlen(s);
scanf("%d%d", &t, &N);
while (t--){
for (i = 1; i <= N; ++i){
scanf("%d", &V[i]);
Poz[V[i]] = i;
}
ok = true; poz = 0;
expr();
printf("%d\n", (int) ok);
}
}