Cod sursa(job #1086527)

Utilizator deneoAdrian Craciun deneo Data 18 ianuarie 2014 12:02:26
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("perle.in");
ofstream fout("perle.out");

const int MAXN = 10100;

int n, sir[MAXN];

bool make_sol(char c);

bool get_sol() {
    int rez = 0;

    rez |= make_sol('A');
    rez |= make_sol('B');
    rez |= make_sol('C');

    return rez;
}

bool make_sol(char c) {
    int pointer = 0, last2 = 0;
    string sol;

    sol.push_back(c);

    while (pointer < n && (pointer < sol.size() || last2)) {
        if (pointer > sol.size()) {
            sol += 'C';
            --last2;
        }

        switch (sol[pointer]) {
            case 'B':
                sol.erase(pointer, 1);
                if (sir[pointer] == 3) return 0;
                else if (sir[pointer] == 2) sol += "2B";
                else if (sir[pointer] == 1) sol += "1A3AC";
                break;
            case 'C':
                sol.erase(pointer, 1);
                if (sir[pointer] == 2) sol += "2";
                else if (sir[pointer] == 3) {
                    sol += '3B';
                    ++last2;
                }
                else if (sir[pointer] == 1) sol += "12A";
                break;
            default:
                if (sol[pointer] != 'A' && (int)sol[pointer] - '0' != sir[pointer])
                    return 0;
        }

        ++pointer;
    }

    if (sol.size() != n)
        return 0;
    return 1;
}

int main() {
    int t;
    fin >> t;

    for (; t; --t) {
        fin >> n;

        for (int i = 0; i < n; ++i)
            fin >> sir[i];

        fout << get_sol() << "\n";
    }

    return 0;
}