import java.util.*;
public class Main {
public static int[] findSubarraySizes(int n, int k, int[] arr) {
Map
<Integer, Integer
> firstOccurrence
= new HashMap
<>(); Map
<Integer, Integer
> lastOccurrence
= new HashMap
<>(); firstOccurrence.put(0, 0);
int prefixSum
= 0, maxLength
= 0, minLength
= Integer.
MAX_VALUE;
for (int j = 1; j <= n; j++) {
prefixSum += arr[j - 1];
int target = prefixSum - k;
if (firstOccurrence.containsKey(target)) {
maxLength
= Math.
max(maxLength, j
- firstOccurrence.
get(target
)); }
if (lastOccurrence.containsKey(target)) {
minLength
= Math.
min(minLength, j
- lastOccurrence.
get(target
)); }
firstOccurrence.putIfAbsent(prefixSum, j);
lastOccurrence.put(prefixSum, j);
}
return new int[]{maxLength, minLength};
}
public static int countSubarraysWithLength(int n, int k, int[] arr, int length) {
if (length == 0) return 0;
int count = 0, sum = 0;
for (int j = 0; j < length; j++) {
sum += arr[j];
}
if (sum == k) count++;
for (int j = length; j < n; j++) {
sum += arr[j] - arr[j - length];
if (sum == k) count++;
}
return count;
}
public static void main
(String[] args
) { int n = 6, k = 5;
int[] arr = {1, 2, 3, 4, 2, 5};
int[] sizes = findSubarraySizes(n, k, arr);
int maxLength = sizes[0], minLength = sizes[1];
int maxCount = countSubarraysWithLength(n, k, arr, maxLength);
int minCount = countSubarraysWithLength(n, k, arr, minLength);
System.
out.
println("Max Length: " + maxLength
+ " Count: " + maxCount
); System.
out.
println("Min Length: " + minLength
+ " Count: " + minCount
); }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgaW50W10gZmluZFN1YmFycmF5U2l6ZXMoaW50IG4sIGludCBrLCBpbnRbXSBhcnIpIHsKICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gZmlyc3RPY2N1cnJlbmNlID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBsYXN0T2NjdXJyZW5jZSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBmaXJzdE9jY3VycmVuY2UucHV0KDAsIDApOwoKICAgICAgICBpbnQgcHJlZml4U3VtID0gMCwgbWF4TGVuZ3RoID0gMCwgbWluTGVuZ3RoID0gSW50ZWdlci5NQVhfVkFMVUU7CgogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG47IGorKykgewogICAgICAgICAgICBwcmVmaXhTdW0gKz0gYXJyW2ogLSAxXTsKICAgICAgICAgICAgaW50IHRhcmdldCA9IHByZWZpeFN1bSAtIGs7CgogICAgICAgICAgICBpZiAoZmlyc3RPY2N1cnJlbmNlLmNvbnRhaW5zS2V5KHRhcmdldCkpIHsKICAgICAgICAgICAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCwgaiAtIGZpcnN0T2NjdXJyZW5jZS5nZXQodGFyZ2V0KSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsYXN0T2NjdXJyZW5jZS5jb250YWluc0tleSh0YXJnZXQpKSB7CiAgICAgICAgICAgICAgICBtaW5MZW5ndGggPSBNYXRoLm1pbihtaW5MZW5ndGgsIGogLSBsYXN0T2NjdXJyZW5jZS5nZXQodGFyZ2V0KSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZpcnN0T2NjdXJyZW5jZS5wdXRJZkFic2VudChwcmVmaXhTdW0sIGopOwogICAgICAgICAgICBsYXN0T2NjdXJyZW5jZS5wdXQocHJlZml4U3VtLCBqKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgaW50W117bWF4TGVuZ3RoLCBtaW5MZW5ndGh9OwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50U3ViYXJyYXlzV2l0aExlbmd0aChpbnQgbiwgaW50IGssIGludFtdIGFyciwgaW50IGxlbmd0aCkgewogICAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIDA7CgogICAgICAgIGludCBjb3VudCA9IDAsIHN1bSA9IDA7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgc3VtICs9IGFycltqXTsKICAgICAgICB9CgogICAgICAgIGlmIChzdW0gPT0gaykgY291bnQrKzsKCiAgICAgICAgZm9yIChpbnQgaiA9IGxlbmd0aDsgaiA8IG47IGorKykgewogICAgICAgICAgICBzdW0gKz0gYXJyW2pdIC0gYXJyW2ogLSBsZW5ndGhdOwogICAgICAgICAgICBpZiAoc3VtID09IGspIGNvdW50Kys7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGludCBuID0gNiwgayA9IDU7CiAgICAgICAgaW50W10gYXJyID0gezEsIDIsIDMsIDQsIDIsIDV9OwoKICAgICAgICBpbnRbXSBzaXplcyA9IGZpbmRTdWJhcnJheVNpemVzKG4sIGssIGFycik7CiAgICAgICAgaW50IG1heExlbmd0aCA9IHNpemVzWzBdLCBtaW5MZW5ndGggPSBzaXplc1sxXTsKCiAgICAgICAgaW50IG1heENvdW50ID0gY291bnRTdWJhcnJheXNXaXRoTGVuZ3RoKG4sIGssIGFyciwgbWF4TGVuZ3RoKTsKICAgICAgICBpbnQgbWluQ291bnQgPSBjb3VudFN1YmFycmF5c1dpdGhMZW5ndGgobiwgaywgYXJyLCBtaW5MZW5ndGgpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1heCBMZW5ndGg6ICIgKyBtYXhMZW5ndGggKyAiIENvdW50OiAiICsgbWF4Q291bnQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluIExlbmd0aDogIiArIG1pbkxlbmd0aCArICIgQ291bnQ6ICIgKyBtaW5Db3VudCk7CiAgICB9Cn0K