Skip to content

Commit 7d8741d

Browse files
authored
Create Solution.java
This works.
1 parent c5bfe3f commit 7d8741d

File tree

1 file changed

+85
-0
lines changed
  • solution/1900-1999/1938.Maximum Genetic Difference Query

1 file changed

+85
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
class TrieNode {
2+
public TrieNode[] children = new TrieNode[2];
3+
public int count = 0;
4+
}
5+
6+
class Trie {
7+
public void update(int num, int val) {
8+
TrieNode node = root;
9+
for (int i = HEIGHT; i >= 0; --i) {
10+
final int bit = (num >> i) & 1;
11+
if (node.children[bit] == null)
12+
node.children[bit] = new TrieNode();
13+
node = node.children[bit];
14+
node.count += val;
15+
}
16+
}
17+
18+
public int query(int num) {
19+
int ans = 0;
20+
TrieNode node = root;
21+
for (int i = HEIGHT; i >= 0; --i) {
22+
final int bit = (num >> i) & 1;
23+
final int targetBit = bit ^ 1;
24+
if (node.children[targetBit] != null && node.children[targetBit].count > 0) {
25+
ans += 1 << i;
26+
node = node.children[targetBit];
27+
} else {
28+
node = node.children[targetBit ^ 1];
29+
}
30+
}
31+
return ans;
32+
}
33+
34+
private static final int HEIGHT = 17;
35+
TrieNode root = new TrieNode();
36+
}
37+
38+
class Solution {
39+
public int[] maxGeneticDifference(int[] parents, int[][] queries) {
40+
final int n = parents.length;
41+
int[] ans = new int[queries.length];
42+
int rootVal = -1;
43+
List<Integer>[] tree = new List[n];
44+
45+
for (int i = 0; i < n; ++i)
46+
tree[i] = new ArrayList<>();
47+
48+
// {node: (index, val)}
49+
Map<Integer, List<Pair<Integer, Integer>>> nodeToQueries = new HashMap<>();
50+
Trie trie = new Trie();
51+
52+
for (int i = 0; i < parents.length; ++i)
53+
if (parents[i] == -1)
54+
rootVal = i;
55+
else
56+
tree[parents[i]].add(i);
57+
58+
for (int i = 0; i < queries.length; ++i) {
59+
final int node = queries[i][0];
60+
final int val = queries[i][1];
61+
nodeToQueries.putIfAbsent(node, new ArrayList<>());
62+
nodeToQueries.get(node).add(new Pair<>(i, val));
63+
}
64+
65+
dfs(rootVal, trie, tree, nodeToQueries, ans);
66+
return ans;
67+
}
68+
69+
private void dfs(int node, Trie trie, List<Integer>[] tree,
70+
Map<Integer, List<Pair<Integer, Integer>>> nodeToQueries, int[] ans) {
71+
trie.update(node, 1);
72+
73+
if (nodeToQueries.containsKey(node))
74+
for (Pair<Integer, Integer> query : nodeToQueries.get(node)) {
75+
final int i = query.getKey();
76+
final int val = query.getValue();
77+
ans[i] = trie.query(val);
78+
}
79+
80+
for (final int child : tree[node])
81+
dfs(child, trie, tree, nodeToQueries, ans);
82+
83+
trie.update(node, -1);
84+
}
85+
}

0 commit comments

Comments
 (0)