1.先找到所有需要<重复>的节点;
2.对树上的节点进行标记,上面部分为可以<重复>的节点,下面部分为不能<重复>的节点。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<iomanip>
#include<tuple>
using namespace std;
typedef pair<int, int> P;
typedef long long ll;
const int MAX_N = 2e5 + 5;
int n, k;
char s[MAX_N + 1];
int lc[MAX_N], rc[MAX_N], par[MAX_N][19];
int used[MAX_N], used_k;
int a[MAX_N];
bool need[MAX_N];
void dfs(int v,int &t) {
if (lc[v] != -1)dfs(lc[v], t);
a[t++] = v;
if (rc[v] != -1)dfs(rc[v], t);
}
bool check(int v) {
int ans = 0;
for (int i = 18; i >= 0; i--) {
if (used[par[v][i]] == 0) {
v = par[v][i];
ans += (1 << i);
}
}
return ans + 1 + used_k <= k;
}
void up(int v) {
while (used[v]==0){
used[v] = 1;
v = par[v][0];
used_k++;
}
}
void down(int v) {
used[v] = -1;
if (lc[v] != -1 && used[lc[v]] != -1)down(lc[v]);
if (rc[v] != -1 && used[rc[v]] != -1)down(rc[v]);
}
void solve() {
par[0][0] = n;
par[n][0] = n;
used[n] = 1;
for (int i = 1; i < 19; i++) {
for (int j = 0; j <= n; j++) {
par[j][i] = par[par[j][i - 1]][i - 1];
}
}
int t = 0;
dfs(0, t);
t = n - 1;
for (int i = n - 2; i >= 0; i--) {
if (s[a[i]] == s[a[i + 1]]) {
if (s[a[i]] < s[a[t]])need[i] = true;
}
else {
if(s[a[i]] < s[a[i + 1]])need[i] = true;
t = i + 1;
}
}
for (int i = 0; i < n; i++) {
if (used[a[i]] == 0) {
if (!need[i])down(a[i]);
else {
if (check(a[i]))up(a[i]);
else down(a[i]);
}
}
}
for (int i = 0; i < n; i++) {
cout << s[a[i]];
if (used[a[i]] == 1) {
cout << s[a[i]];
}
}
cout << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
cin >> s;
for (int i = 0; i < n; i++) {
int l, r;
cin >> l >> r;
l--; r--;
lc[i] = l;
rc[i] = r;
if (l != -1)par[l][0] = i;
if (r != -1)par[r][0] = i;
}
solve();
return 0;
}