Cod sursa(job #1609265)

Utilizator relu.draganDragan Relu relu.dragan Data 22 februarie 2016 18:16:41
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.32 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <unordered_map>
using namespace std;
ifstream in("brazi.in");
ofstream out("brazi.out");
bool checkSimilar(vector<vector<int>>& a, vector<vector<int>>& b, int nodA, int nodB)
{
    if (nodA == 0 && nodB == 0)
        return true;
    if ((nodA == 0 && nodB != 0) || (nodA != 0 && nodB == 0))
        return false;


    return checkSimilar(a, b, a[nodA][0], b[nodB][0]) &&
            checkSimilar(a, b, a[nodA][1], b[nodB][1]);
}

void generateCodes(vector<vector<int>>& brad, int rad, string& code)
{

    if (brad[rad][0] != 0)
    {
        code += "0";
        generateCodes(brad, brad[rad][0], code);
    }
    if (brad[rad][1] != 0)
    {

        code += "1";
        generateCodes(brad, brad[rad][1], code);
    }
    code += "2";

}
int main()
{
    int T;
    in >> T;
    vector<vector<vector<int>>> brazi;
    vector<int> radacini(T);
    for (int k = 0; k < T; k++)

    {
        int N;
        in >> N;
        vector<vector<int>> graf(N+1, vector<int>(2,0));
        vector<int> grad(N+1, 0);
        for (int i = 0; i < N-1; i++)
        {
            int x, y, t;
            in >> x >> y >> t;
            grad[y]++;
            if (t == 0)
            {
                graf[x][0] = y;

            }
            else
            {
                graf[x][1] = y;

            }
        }
        brazi.push_back(graf);
        for (int i = 1; i < grad.size(); i++)
            if (grad[i] == 0)
            {
                radacini[k] = i;
                break;
            }
    }


    vector<string> codes(T);
    for (int i = 0; i < T; i++)
    {

        string currentCode;
        generateCodes(brazi[i], radacini[i], currentCode);
        codes[i] = currentCode;

    }
   // for (int i = 0; i < T; i++)
    //    cout << codes[i] << " ";
    unordered_map<string, int> appearances;
    out << "0\n";
    appearances[codes[0]] = 1;
    for (int i = 1; i < T; i++)
    {
        if (appearances.find(codes[i]) != appearances.end())
        {
            out << appearances[codes[i]] << "\n";
            appearances[codes[i]]++;
        }
        else{
            out << "0" << "\n";
            appearances[codes[i]] = 1;
        }


    }
    return 0;
}