import java.util.*;
public class Main {
public static Pair
<Integer, Integer
> findSubarraySizes
(int n,
int k,
int[] arr
) { Map
<Integer, Integer
> mp
= new HashMap
<>(); Map
<Integer, Integer
> mp2
= new HashMap
<>(); mp.put(0, 0);
int pSum = 0;
int maxLength = 0;
for (int j = 1; j <= n; j++) {
pSum += arr[j - 1];
int x = pSum - k;
if (mp.containsKey(x)) {
int i = mp.get(x) + 1;
int curLength = j - i + 1;
if (curLength > maxLength) {
maxLength = curLength;
}
}
if (mp2.containsKey(x)) {
int i = mp2.get(x) + 1;
int curLength = j - i + 1;
if (curLength < minLength) {
minLength = curLength;
}
}
mp.putIfAbsent(pSum, j);
mp2.put(pSum, j);
}
return new Pair<>(maxLength, minLength);
}
public static int countSubarraysWithLength(int n, int k, int[] arr, int targetLength) {
if (targetLength == 0) return 0;
if (targetLength
== Integer.
MAX_VALUE) return 0; int count = 0;
int windowSum = 0;
for (int j = 0; j < targetLength; j++) {
windowSum += arr[j];
}
if (windowSum == k) {
count++;
}
for (int j = targetLength; j < n; j++) {
windowSum += arr[j] - arr[j - targetLength];
if (windowSum == k) {
count++;
}
}
return count;
}
public static void main
(String[] args
) { int n = 6;
int k = 200;
int[] arr = {1, 2, 3, 4, 2, 5};
Pair
<Integer, Integer
> sizes
= findSubarraySizes
(n, k, arr
); int maxLength = sizes.getKey();
int minLength = sizes.getValue();
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
); }
}
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewoKICAgIHB1YmxpYyBzdGF0aWMgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBmaW5kU3ViYXJyYXlTaXplcyhpbnQgbiwgaW50IGssIGludFtdIGFycikgewogICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbXAyID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgIG1wLnB1dCgwLCAwKTsKICAgICAgICBpbnQgcFN1bSA9IDA7CiAgICAgICAgaW50IG1heExlbmd0aCA9IDA7CiAgICAgICAgaW50IG1pbkxlbmd0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwoKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyBqKyspIHsKICAgICAgICAgICAgcFN1bSArPSBhcnJbaiAtIDFdOwogICAgICAgICAgICBpbnQgeCA9IHBTdW0gLSBrOwoKICAgICAgICAgICAgaWYgKG1wLmNvbnRhaW5zS2V5KHgpKSB7CiAgICAgICAgICAgICAgICBpbnQgaSA9IG1wLmdldCh4KSArIDE7CiAgICAgICAgICAgICAgICBpbnQgY3VyTGVuZ3RoID0gaiAtIGkgKyAxOwogICAgICAgICAgICAgICAgaWYgKGN1ckxlbmd0aCA+IG1heExlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCA9IGN1ckxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG1wMi5jb250YWluc0tleSh4KSkgewogICAgICAgICAgICAgICAgaW50IGkgPSBtcDIuZ2V0KHgpICsgMTsKICAgICAgICAgICAgICAgIGludCBjdXJMZW5ndGggPSBqIC0gaSArIDE7CiAgICAgICAgICAgICAgICBpZiAoY3VyTGVuZ3RoIDwgbWluTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgbWluTGVuZ3RoID0gY3VyTGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBtcC5wdXRJZkFic2VudChwU3VtLCBqKTsKICAgICAgICAgICAgbXAyLnB1dChwU3VtLCBqKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgUGFpcjw+KG1heExlbmd0aCwgbWluTGVuZ3RoKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudFN1YmFycmF5c1dpdGhMZW5ndGgoaW50IG4sIGludCBrLCBpbnRbXSBhcnIsIGludCB0YXJnZXRMZW5ndGgpIHsKICAgICAgICBpZiAodGFyZ2V0TGVuZ3RoID09IDApIHJldHVybiAwOwogICAgICAgIAogICAgICAgIGlmICh0YXJnZXRMZW5ndGggPT0gSW50ZWdlci5NQVhfVkFMVUUpIHJldHVybiAwOwogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgaW50IHdpbmRvd1N1bSA9IDA7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFyZ2V0TGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgd2luZG93U3VtICs9IGFycltqXTsKICAgICAgICB9CgogICAgICAgIGlmICh3aW5kb3dTdW0gPT0gaykgewogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaiA9IHRhcmdldExlbmd0aDsgaiA8IG47IGorKykgewogICAgICAgICAgICB3aW5kb3dTdW0gKz0gYXJyW2pdIC0gYXJyW2ogLSB0YXJnZXRMZW5ndGhdOwogICAgICAgICAgICBpZiAod2luZG93U3VtID09IGspIHsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBjb3VudDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgaW50IG4gPSA2OwogICAgICAgIGludCBrID0gMjAwOwogICAgICAgIGludFtdIGFyciA9IHsxLCAyLCAzLCA0LCAyLCA1fTsKCiAgICAgICAgUGFpcjxJbnRlZ2VyLCBJbnRlZ2VyPiBzaXplcyA9IGZpbmRTdWJhcnJheVNpemVzKG4sIGssIGFycik7CiAgICAgICAgaW50IG1heExlbmd0aCA9IHNpemVzLmdldEtleSgpOwogICAgICAgIGludCBtaW5MZW5ndGggPSBzaXplcy5nZXRWYWx1ZSgpOwoKICAgICAgICBpbnQgbWF4Q291bnQgPSBjb3VudFN1YmFycmF5c1dpdGhMZW5ndGgobiwgaywgYXJyLCBtYXhMZW5ndGgpOwogICAgICAgIGludCBtaW5Db3VudCA9IGNvdW50U3ViYXJyYXlzV2l0aExlbmd0aChuLCBrLCBhcnIsIG1pbkxlbmd0aCk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWF4IExlbmd0aDogIiArIG1heExlbmd0aCArICIgQ291bnQ6ICIgKyBtYXhDb3VudCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaW4gTGVuZ3RoOiAiICsgbWluTGVuZ3RoICsgIiBDb3VudDogIiArIG1pbkNvdW50KTsKICAgIH0KfQoKY2xhc3MgUGFpcjxLLCBWPiB7CiAgICBwcml2YXRlIEsga2V5OwogICAgcHJpdmF0ZSBWIHZhbHVlOwoKICAgIHB1YmxpYyBQYWlyKEsga2V5LCBWIHZhbHVlKSB7CiAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgfQoKICAgIHB1YmxpYyBLIGdldEtleSgpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgfQoKICAgIHB1YmxpYyBWIGdldFZhbHVlKCkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KfQo=