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;
}
 

Leave a Reply

Your email address will not be published. Required fields are marked *