#include<iostream> //Largest sum
#include<vector>
#include<unordered_map>
using namespace std;
int longestSubarray(vector<int>&store,int k){
unordered_map<int, int> preSum;
int maxLen = 0;
int sum = 0;
for (int i = 0; i < store.size();i++){
sum = sum + store[i];
// If total sum from index 0 to i is equal to k
if(sum==k){
maxLen = max(maxLen, i + 1);
}
int rem = sum - k;
if(preSum.find(rem)!=preSum.end()){
int newLen=i-preSum[rem];
maxLen = max(newLen, maxLen);
}
if(preSum.find(sum)==preSum.end()){ //This ensures you only store the first occurrence of each prefix sum as we want max length
preSum[sum] = i;
}
}
return maxLen;
}
int main(){
vector<int> arr = {2, 0, 0, 3};
int k = 3;
int result = longestSubarray(arr, k);
cout << "The maximum subarray with sum equal to k " << result;
return 0;
}
// #include<iostream> //Smallest sum of subarray
// #include<vector>
// #include<unordered_map>
// using namespace std;
// int smallestSubarray(vector<int>&store,int k){
// unordered_map<int, int> preSum;
// int minLen = 1e9;
// int sum = 0;
// for (int i = 0; i < store.size();i++){
// sum = sum + store[i];
// if(sum==k){
// minLen = min(minLen, i + 1);
// }
// int rem = sum - k;
// if(preSum.find(rem)!=preSum.end()){
// int newLen=i-preSum[rem];
// minLen = min(newLen, minLen);
// }
// preSum[sum] = i; //for the smallest subarray
// }
// return minLen;
// }
// int main(){
// vector<int> arr = {2, 0, 0, 3};
// int k = 3;
// int result = smallestSubarray(arr, k);
// cout << "The minimum subarray with sum equal to k " << result;
// return 0;
// }
I2luY2x1ZGU8aW9zdHJlYW0+ICAvL0xhcmdlc3Qgc3VtCiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IGxvbmdlc3RTdWJhcnJheSh2ZWN0b3I8aW50PiZzdG9yZSxpbnQgayl7CiAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PiBwcmVTdW07CiAgICBpbnQgbWF4TGVuID0gMDsKICAgIGludCBzdW0gPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yZS5zaXplKCk7aSsrKXsKICAgICAgICBzdW0gPSBzdW0gKyBzdG9yZVtpXTsKIAogICAgICAgIC8vIElmIHRvdGFsIHN1bSBmcm9tIGluZGV4IDAgdG8gaSBpcyBlcXVhbCB0byBrCiAgICAgICAgaWYoc3VtPT1rKXsKICAgICAgICAgICAgbWF4TGVuID0gbWF4KG1heExlbiwgaSArIDEpOwogICAgICAgIH0KICAgICAgICBpbnQgcmVtID0gc3VtIC0gazsKICAgICAgICBpZihwcmVTdW0uZmluZChyZW0pIT1wcmVTdW0uZW5kKCkpewogICAgICAgICAgICBpbnQgbmV3TGVuPWktcHJlU3VtW3JlbV07CiAgICAgICAgICAgIG1heExlbiA9IG1heChuZXdMZW4sIG1heExlbik7CiAgICAgICAgfQogICAgICAgIGlmKHByZVN1bS5maW5kKHN1bSk9PXByZVN1bS5lbmQoKSl7IC8vVGhpcyBlbnN1cmVzIHlvdSBvbmx5IHN0b3JlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggcHJlZml4IHN1bSBhcyB3ZSB3YW50IG1heCBsZW5ndGgKICAgICAgICAgICAgcHJlU3VtW3N1bV0gPSBpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXhMZW47Cn0KaW50IG1haW4oKXsKICAgIHZlY3RvcjxpbnQ+IGFyciA9IHsyLCAwLCAwLCAzfTsKICAgIGludCBrID0gMzsKICAgIGludCByZXN1bHQgPSBsb25nZXN0U3ViYXJyYXkoYXJyLCBrKTsKICAgIGNvdXQgPDwgIlRoZSBtYXhpbXVtIHN1YmFycmF5IHdpdGggc3VtIGVxdWFsIHRvIGsgIiA8PCByZXN1bHQ7CiAKICAgIHJldHVybiAwOwp9CiAKIAogCiAKIAovLyAjaW5jbHVkZTxpb3N0cmVhbT4gIC8vU21hbGxlc3Qgc3VtIG9mIHN1YmFycmF5Ci8vICNpbmNsdWRlPHZlY3Rvcj4KLy8gI2luY2x1ZGU8dW5vcmRlcmVkX21hcD4KLy8gdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLy8gaW50IHNtYWxsZXN0U3ViYXJyYXkodmVjdG9yPGludD4mc3RvcmUsaW50IGspewovLyAgICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gcHJlU3VtOwovLyAgICAgaW50IG1pbkxlbiA9IDFlOTsKLy8gICAgIGludCBzdW0gPSAwOwovLyAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdG9yZS5zaXplKCk7aSsrKXsKLy8gICAgICAgICBzdW0gPSBzdW0gKyBzdG9yZVtpXTsKLy8gICAgICAgICBpZihzdW09PWspewovLyAgICAgICAgICAgICBtaW5MZW4gPSBtaW4obWluTGVuLCBpICsgMSk7Ci8vICAgICAgICAgfQovLyAgICAgICAgIGludCByZW0gPSBzdW0gLSBrOwovLyAgICAgICAgIGlmKHByZVN1bS5maW5kKHJlbSkhPXByZVN1bS5lbmQoKSl7Ci8vICAgICAgICAgICAgIGludCBuZXdMZW49aS1wcmVTdW1bcmVtXTsKLy8gICAgICAgICAgICAgbWluTGVuID0gbWluKG5ld0xlbiwgbWluTGVuKTsKLy8gICAgICAgICB9CiAKLy8gICAgICAgICAgICAgcHJlU3VtW3N1bV0gPSBpOyAgIC8vZm9yIHRoZSBzbWFsbGVzdCBzdWJhcnJheQogCi8vICAgICB9Ci8vICAgICByZXR1cm4gbWluTGVuOwovLyB9Ci8vIGludCBtYWluKCl7Ci8vICAgICB2ZWN0b3I8aW50PiBhcnIgPSB7MiwgMCwgMCwgM307Ci8vICAgICBpbnQgayA9IDM7Ci8vICAgICBpbnQgcmVzdWx0ID0gc21hbGxlc3RTdWJhcnJheShhcnIsIGspOwovLyAgICAgY291dCA8PCAiVGhlIG1pbmltdW0gc3ViYXJyYXkgd2l0aCBzdW0gZXF1YWwgdG8gayAiIDw8IHJlc3VsdDsKIAovLyAgICAgcmV0dXJuIDA7Ci8vIH0=