Skip to content

Commit 50b2e37

Browse files
committed
Improved tasks 3707-3715
1 parent e7e9729 commit 50b2e37

File tree

8 files changed

+153
-101
lines changed

8 files changed

+153
-101
lines changed

src/main/java/g3701_3800/s3707_equal_score_substrings/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3701_3800.s3707_equal_score_substrings;
22

3-
// #Easy #Biweekly_Contest_167 #2025_10_12_Time_1_ms_(100.00%)_Space_42.74_MB_(100.00%)
3+
// #Easy #Biweekly_Contest_167 #2025_10_13_Time_1_ms_(100.00%)_Space_42.24_MB_(96.38%)
44

55
public class Solution {
66
public boolean scoreBalance(String s) {

src/main/java/g3701_3800/s3708_longest_fibonacci_subarray/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3701_3800.s3708_longest_fibonacci_subarray;
22

3-
// #Medium #Biweekly_Contest_167 #2025_10_12_Time_2_ms_(100.00%)_Space_58.15_MB_(100.00%)
3+
// #Medium #Biweekly_Contest_167 #2025_10_13_Time_1_ms_(100.00%)_Space_58.20_MB_(81.69%)
44

55
public class Solution {
66
public int longestSubarray(int[] nums) {

src/main/java/g3701_3800/s3709_design_exam_scores_tracker/ExamTracker.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3701_3800.s3709_design_exam_scores_tracker;
22

3-
// #Medium #Biweekly_Contest_167 #2025_10_12_Time_120_ms_(100.00%)_Space_101.08_MB_(100.00%)
3+
// #Medium #Biweekly_Contest_167 #2025_10_13_Time_114_ms_(100.00%)_Space_101.17_MB_(89.67%)
44

55
import java.util.ArrayList;
66
import java.util.List;

src/main/java/g3701_3800/s3710_maximum_partition_factor/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3701_3800.s3710_maximum_partition_factor;
22

3-
// #Hard #Biweekly_Contest_167 #2025_10_12_Time_304_ms_(50.00%)_Space_55.99_MB_(50.00%)
3+
// #Hard #Biweekly_Contest_167 #2025_10_13_Time_305_ms_(50.00%)_Space_55.41_MB_(49.74%)
44

55
import java.util.ArrayList;
66
import java.util.Comparator;
Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package g3701_3800.s3712_sum_of_elements_with_frequency_divisible_by_k;
22

3-
// #Easy #Weekly_Contest_471 #2025_10_12_Time_3_ms_(_%)_Space_43.23_MB_(_%)
4-
5-
import java.util.HashMap;
6-
import java.util.Map;
3+
// #Easy #Weekly_Contest_471 #2025_10_13_Time_1_ms_(99.96%)_Space_42.21_MB_(100.00%)
74

85
public class Solution {
96
public int sumDivisibleByK(int[] nums, int k) {
10-
Map<Integer, Integer> mp = new HashMap<>();
11-
for (int i : nums) {
12-
mp.put(i, mp.getOrDefault(i, 0) + 1);
7+
int max = 0;
8+
int sum = 0;
9+
for (int num : nums) {
10+
max = Math.max(num, max);
11+
}
12+
int[] cnt = new int[max + 1];
13+
for (int num : nums) {
14+
cnt[num]++;
1315
}
14-
int ans = 0;
15-
for (Map.Entry<Integer, Integer> e : mp.entrySet()) {
16-
if (e.getValue() % k == 0) {
17-
ans += e.getKey() * e.getValue();
16+
for (int i = 1; i < cnt.length; i++) {
17+
if (cnt[i] != 0 && cnt[i] % k == 0) {
18+
sum += i * cnt[i];
1819
}
1920
}
20-
return ans;
21+
return sum;
2122
}
2223
}

src/main/java/g3701_3800/s3713_longest_balanced_substring_i/Solution.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3701_3800.s3713_longest_balanced_substring_i;
22

3-
// #Medium #Weekly_Contest_471 #2025_10_12_Time_32_ms_(100.00%)_Space_45.70_MB_(50.00%)
3+
// #Medium #Weekly_Contest_471 #2025_10_13_Time_34_ms_(99.73%)_Space_45.52_MB_(50.00%)
44

55
public class Solution {
66
public int longestBalanced(String s) {
Lines changed: 77 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,92 @@
11
package g3701_3800.s3714_longest_balanced_substring_ii;
22

3-
// #Medium #Weekly_Contest_471 #2025_10_12_Time_788_ms_(_%)_Space_144.17_MB_(_%)
3+
// #Medium #Weekly_Contest_471 #2025_10_13_Time_196_ms_(98.70%)_Space_60.59_MB_(100.00%)
44

55
import java.util.HashMap;
6-
import java.util.Map;
76

8-
@SuppressWarnings("unchecked")
97
public class Solution {
10-
private int n;
11-
12-
// key function: converts 3 counts into a unique number
13-
private long key(long[] cnt) {
14-
return cnt[0] + cnt[1] * (n + 1L) + cnt[2] * (n + 1L) * (n + 1L);
15-
}
16-
178
public int longestBalanced(String s) {
18-
n = s.length();
19-
// counts of 'a','b','c'
20-
long[] cnt = new long[3];
21-
long[] cur = new long[3];
22-
int ans = 0;
23-
// create 8 maps for all subsets
24-
Map<Long, Integer>[] mp = new HashMap[8];
25-
for (int j = 0; j < 8; j++) {
26-
mp[j] = new HashMap<>();
27-
// initialize with 0 -> -1
28-
mp[j].put(0L, -1);
9+
int n = s.length();
10+
int max1 = 1;
11+
int curr = 1;
12+
for (int i = 1; i < n; i++) {
13+
if (s.charAt(i) == s.charAt(i - 1)) {
14+
curr++;
15+
} else {
16+
max1 = Math.max(max1, curr);
17+
curr = 1;
18+
}
2919
}
30-
for (int i = 0; i < n; i++) {
31-
int x = s.charAt(i) - 'a';
32-
cnt[x]++;
33-
// iterate over all non-empty subsets (1..7)
34-
for (int m = 7; m > 0; m--) {
35-
long mind = n;
36-
for (int b = 0; b < 3; b++) {
37-
int bit = 1 << b;
38-
if ((bit & m) != 0) {
39-
mind = Math.min(mind, cnt[b]);
40-
}
41-
cur[b] = cnt[b];
20+
max1 = Math.max(max1, curr);
21+
int max2 = 0;
22+
char[] chars = {'a', 'b', 'c'};
23+
for (int p = 0; p < 3; p++) {
24+
char x = chars[p];
25+
char y = chars[(p + 1) % 3];
26+
char z = chars[(p + 2) % 3];
27+
int ii = 0;
28+
while (ii < n) {
29+
if (s.charAt(ii) == z) {
30+
ii++;
31+
continue;
4232
}
43-
for (int b = 0; b < 3; b++) {
44-
int bit = 1 << b;
45-
if ((bit & m) != 0) {
46-
cur[b] -= mind;
47-
}
33+
int start = ii;
34+
while (ii < n && s.charAt(ii) != z) {
35+
ii++;
36+
}
37+
int endd = ii;
38+
int lenSeg = endd - start;
39+
if (lenSeg < 2) {
40+
continue;
4841
}
49-
long k = key(cur);
50-
if (mp[m].containsKey(k)) {
51-
ans = Math.max(ans, i - mp[m].get(k));
52-
} else {
53-
mp[m].put(k, i);
42+
HashMap<Integer, Integer> map2 = new HashMap<>();
43+
int diff = 0;
44+
map2.put(0, 0);
45+
for (int j = start; j < endd; j++) {
46+
char ch = s.charAt(j);
47+
if (ch == x) {
48+
diff += 1;
49+
} else if (ch == y) {
50+
diff -= 1;
51+
}
52+
int localPos = j - start + 1;
53+
Integer prevv = map2.get(diff);
54+
if (prevv != null) {
55+
max2 = Math.max(max2, localPos - prevv);
56+
}
57+
if (!map2.containsKey(diff)) {
58+
map2.put(diff, localPos);
59+
}
5460
}
5561
}
5662
}
57-
return ans;
63+
int max3 = 0;
64+
HashMap<Long, Integer> map3 = new HashMap<>();
65+
int d1 = 0;
66+
int d2 = 0;
67+
long offset = 100001L;
68+
long mult = 200003L;
69+
long keyy = (d1 + offset) * mult + (d2 + offset);
70+
map3.put(keyy, 0);
71+
for (int i = 1; i <= n; i++) {
72+
char ch = s.charAt(i - 1);
73+
if (ch == 'a') {
74+
d1 += 1;
75+
d2 += 1;
76+
} else if (ch == 'b') {
77+
d1 -= 1;
78+
} else if (ch == 'c') {
79+
d2 -= 1;
80+
}
81+
keyy = (d1 + offset) * mult + (d2 + offset);
82+
Integer prev = map3.get(keyy);
83+
if (prev != null) {
84+
max3 = Math.max(max3, i - prev);
85+
}
86+
if (!map3.containsKey(keyy)) {
87+
map3.put(keyy, i);
88+
}
89+
}
90+
return Math.max(max1, Math.max(max2, max3));
5891
}
5992
}
Lines changed: 58 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,83 @@
11
package g3701_3800.s3715_sum_of_perfect_square_ancestors;
22

3-
// #Hard #Weekly_Contest_471 #2025_10_12_Time_234_ms_(100.00%)_Space_113.24_MB_(100.00%)
3+
// #Hard #Weekly_Contest_471 #2025_10_13_Time_134_ms_(95.90%)_Space_122.89_MB_(100.00%)
44

55
import java.util.ArrayList;
66
import java.util.HashMap;
77
import java.util.List;
88
import java.util.Map;
99

1010
public class Solution {
11+
private static final int MAX = 100000;
12+
// smallest prime factor
13+
private static final int[] SPF = new int[MAX + 1];
14+
15+
// Precompute smallest prime factors for fast factorization
16+
static {
17+
for (int i = 2; i <= MAX; i++) {
18+
if (SPF[i] == 0) {
19+
for (int j = i; j <= MAX; j += i) {
20+
if (SPF[j] == 0) {
21+
SPF[j] = i;
22+
}
23+
}
24+
}
25+
}
26+
}
27+
1128
public long sumOfAncestors(int n, int[][] edges, int[] nums) {
12-
List<List<Integer>> g = new ArrayList<>();
29+
// Build adjacency list
30+
List<List<Integer>> adj = new ArrayList<>();
1331
for (int i = 0; i < n; i++) {
14-
g.add(new ArrayList<>());
32+
adj.add(new ArrayList<>());
1533
}
1634
for (int[] e : edges) {
17-
g.get(e[0]).add(e[1]);
18-
g.get(e[1]).add(e[0]);
19-
}
20-
long[] k = new long[n];
21-
for (int i = 0; i < n; i++) {
22-
k[i] = kernel(nums[i]);
35+
adj.get(e[0]).add(e[1]);
36+
adj.get(e[1]).add(e[0]);
2337
}
24-
Map<Long, Integer> freq = new HashMap<>();
25-
long[] ans = new long[1];
26-
dfs(0, -1, g, k, freq, ans);
27-
return ans[0];
38+
// Map to count kernel frequencies along DFS path
39+
// kernel fits in int (<= nums[i])
40+
Map<Integer, Integer> freq = new HashMap<>();
41+
long total = 0L;
42+
total += dfs(0, -1, adj, nums, freq);
43+
return total;
2844
}
2945

30-
private long kernel(long x) {
31-
long res = 1;
32-
for (long p = 2; p * p <= x; p++) {
33-
int odd = 0;
34-
while (x % p == 0) {
35-
x /= p;
36-
odd ^= 1;
37-
}
38-
if (odd == 1) {
39-
res *= p;
46+
private long dfs(
47+
int node, int parent, List<List<Integer>> adj, int[] nums, Map<Integer, Integer> freq) {
48+
// kernel <= nums[node] <= 1e5 fits int
49+
int key = (int) getKernel(nums[node]);
50+
int count = freq.getOrDefault(key, 0);
51+
long sum = count;
52+
freq.put(key, count + 1);
53+
for (int nei : adj.get(node)) {
54+
if (nei != parent) {
55+
sum += dfs(nei, node, adj, nums, freq);
4056
}
4157
}
42-
if (x > 1) {
43-
res *= x;
58+
if (count == 0) {
59+
freq.remove(key);
60+
} else {
61+
freq.put(key, count);
4462
}
45-
return res;
63+
return sum;
4664
}
4765

48-
private void dfs(
49-
int u, int p, List<List<Integer>> g, long[] k, Map<Long, Integer> freq, long[] ans) {
50-
long ku = k[u];
51-
ans[0] += freq.getOrDefault(ku, 0);
52-
freq.put(ku, freq.getOrDefault(ku, 0) + 1);
53-
for (int v : g.get(u)) {
54-
if (v != p) {
55-
dfs(v, u, g, k, freq, ans);
66+
// Compute square-free kernel using prime factorization parity
67+
private long getKernel(int x) {
68+
long key = 1;
69+
while (x > 1) {
70+
int p = SPF[x];
71+
int c = 0;
72+
while (x % p == 0) {
73+
x /= p;
74+
// toggle parity
75+
c ^= 1;
76+
}
77+
if (c == 1) {
78+
key *= p;
5679
}
5780
}
58-
int left = freq.get(ku) - 1;
59-
if (left == 0) {
60-
freq.remove(ku);
61-
} else {
62-
freq.put(ku, left);
63-
}
81+
return key;
6482
}
6583
}

0 commit comments

Comments
 (0)