# Codeforces Round #383 (Div. 1), problem: (D) Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths Solution in C/C++

```#include <bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=(a);i<(b);i++)
#define MOD 1000000007
#define MP make_pair
#define PB push_back
typedef long long ll;

int N, C, sz[500500], x[500500], c[500500], id[500500], mx[500500], dp[500500], len[1<<22], res[500500], rid[500500];
vector<int> ch[500500];

void go (int i) {
sz[i] = 1, id[i] = C++, rid[id[i]] = i;
for (int j : ch[i]) {
x[j] = x[i] ^ c[j], dp[j] = dp[i] + 1;
go(j), sz[i] += sz[j];
}
mx[i] = C;
}

void dfs (int i, bool k) {
int b = -1;
for (int j : ch[i]) if (b == -1 || sz[j] > sz[b]) b = j;
for (int j : ch[i]) if (j != b) dfs(j, 0);
if (b != -1) dfs(b, 1);
for (int j : ch[i]) res[i] = max(res[i], res[j]);

for (int j : ch[i]) if (j != b) {
fo(t, id[j], mx[j]) {
fo(o, 0, 22) if (len[x[rid[t]]^(1<<o)] != -1) {
res[i] = max(res[i], len[x[rid[t]]^(1<<o)] + dp[rid[t]] - 2*dp[i]);
}
if (len[x[rid[t]]] != -1) res[i] = max(res[i], len[x[rid[t]]] + dp[rid[t]] - 2*dp[i]);
}
fo(t, id[j], mx[j]) len[x[rid[t]]] = max(len[x[rid[t]]], dp[rid[t]]);
}

fo(o, 0, 22) if (len[x[i]^(1<<o)] != -1) res[i] = max(res[i], len[x[i]^(1<<o)] - dp[i]);
if (len[x[i]] != -1) res[i] = max(res[i], len[x[i]] - dp[i]);
len[x[i]] = max(len[x[i]], dp[i]);

if (!k) fo(t, id[i], mx[i]) len[x[rid[t]]] = -1;
}

int main () {
scanf("%d", &N);
fo(i, 1, N) {
int p; char t; scanf("%d %c", &p, &t);
ch[p-1].PB(i), c[i] = (1<<(t-'a'));
}
fo(i, 0, 1<<22) len[i] = -1;
go(0);
dfs(0, 1);
fo(i, 0, N) printf("%d ", res[i]); puts("");
return 0;
}```
` `
(Visited 51 times, 1 visits today)
By |2017-04-07T22:11:47+00:00December 17th, 2016|Categories: C/C++, Programming||0 Comments