Pagini recente » Cod sursa (job #863618) | Cod sursa (job #1048339) | Cod sursa (job #2854297) | Cod sursa (job #3248259) | Cod sursa (job #1402484)
#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;
}