Cod sursa(job #1402484)

Utilizator Ionut228Ionut Calofir Ionut228 Data 26 martie 2015 16:59:02
Problema Pedefe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.48 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

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

char nowch, nextch, maxlit;
char sir[500005], snul[11], D[500005], par[25];
int N;
int nod1, nod2;
int A[500005];
string sol, aux;
vector<int> V[500005];
queue<int> Q;

void bfs(int nod)
{
    if (sir[nod] < sol[0])
        return;

    aux.clear();
    aux += sir[nod];

    nowch = D[nod];
    nextch = 'A';

    bool ok = false;

    int pos = 1;
    Q.push(nod);
    A[nod] = 1;
    while (!Q.empty())
    {
        int now = Q.front();
        int nowpos = A[now];
        Q.pop();

        if (D[now] < nextch)
            continue;

        if (!ok)
        {
            if (aux.compare(sol) > 0)
                ok = true;
            if (sol.size() >= pos)
                if (aux[pos - 1] < sol[pos - 1] && !ok)
                {
                    while (!Q.empty())
                        Q.pop();
                    break;
                }
        }

        if (nowpos == pos)
        {
            for (vector<int>::iterator it = V[now].begin(); it != V[now].end(); ++it)
            {
                if (sir[*it] == nowch)
                {
                    nextch = max(nextch, D[*it]);
                    if (D[*it] == nextch)
                    {
                        Q.push(*it);
                        A[*it] = A[now] + 1;
                    }
                }
            }
        }
        else
        {
            ++pos;
            aux += nowch;

            nowch = nextch;
            nextch = 'A';

            for (vector<int>::iterator it = V[now].begin(); it != V[now].end(); ++it)
            {
                if (sir[*it] == nowch)
                {
                    nextch = max(nextch, D[*it]);
                    if (D[*it] == nextch)
                    {
                        Q.push(*it);
                        A[*it] = A[now] + 1;
                    }
                }
            }
        }
    }

    if (aux.compare(sol) > 0)
        sol = aux;
}

void parsare1()
{
    fin.getline(par, 25);
    int lg = strlen(par);
    for (int i = 0; i <= lg - 1; ++i)
        N = N * 10 + int(par[i] - '0');
}

void parsare2()
{
    nod1 = 0;
    nod2 = 0;
    fin.getline(par, 25);
    int lg = strlen(par);
    int i = 0;
    while (par[i] != ' ')
    {
        nod1 = nod1 * 10 + int(par[i] - '0');
        ++i;
    }
    ++i;
    while (i <= lg - 1)
    {
        nod2 = nod2 * 10 + int(par[i] - '0');
        ++i;
    }
}

int main()
{
    //fin >> N;
    //fin.getline(snul, 11);
    parsare1();
    fin.getline(sir + 1, 500005);
    for (int i = 1; i <= N; ++i)
        D[i] = 'A';
    for (int i = 1; i <= N - 1; ++i)
    {
        //fin >> nod1 >> nod2;
        parsare2();
        V[nod1].push_back(nod2);
        D[nod1] = max(D[nod1], sir[nod2]);
    }
    for (int i = 1; i <= N; ++i)
        if (D[i] == 'A')
            D[i] = sir[i];
    for (int i = 1; i <= N; ++i)
        maxlit = max(maxlit, sir[i]);

    bool ok = true;
    char a = sir[1];
    for (int i = 2; i <= N; ++i)
        if (a != sir[i])
            ok = false;

    if (ok == true)
        fout << "lala";
    else
    {
        for (int i = 1; i <= N; ++i)
            if (sir[i] == maxlit)
                bfs(i);

        fout << sol;
    }

    fin.close();
    fout.close();
    return 0;
}