#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
pair<vector<int>, pair<int, int>> findZeroSumSubarrayWithMostRepeatedElement(vector<int>& arr) {
unordered_map<int, int> prefixSumMap; // Stores prefix sums and their first occurrence index
int prefixSum = 0;
int start = -1, end = -1;
int maxFreq = 0, mostRepeatedElement = arr[0], mostRepeatedCount = 0;
prefixSumMap[0] = -1; // Handles cases where subarray starts at index 0
for (int i = 0; i < arr.size(); i++) {
prefixSum += arr[i];
if (prefixSumMap.find(prefixSum) != prefixSumMap.end()) {
int leftIndex = prefixSumMap[prefixSum] + 1;
vector<int> subarray(arr.begin() + leftIndex, arr.begin() + i + 1);
// Count element frequencies in this subarray
unordered_map<int, int> tempFreq;
for (int num : subarray) tempFreq[num]++;
// Find the most frequent element
for (auto& [num, freq] : tempFreq) {
if (freq > maxFreq) {
maxFreq = freq;
mostRepeatedElement = num;
mostRepeatedCount = freq;
start = leftIndex;
end = i;
}
}
} else {
prefixSumMap[prefixSum] = i;
}
}
vector<int> bestSubarray;
if (start != -1) {
bestSubarray.assign(arr.begin() + start, arr.begin() + end + 1);
}
return {bestSubarray, {mostRepeatedElement, mostRepeatedCount}};
}
int main() {
vector<int> arr = {4, 2, -3, 1, 6, -3, 1, 3, -2, -1, 4, -4, 2};
auto [subarray, elementInfo] = findZeroSumSubarrayWithMostRepeatedElement(arr);
int mostRepeatedElement = elementInfo.first;
int mostRepeatedCount = elementInfo.second;
cout << "Optimal Zero-Sum Subarray: ";
for (int num : subarray) cout << num << " ";
cout << "\nMost Repeated Element: " << mostRepeatedElement
<< " (Repeated " << mostRepeatedCount << " times)" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpwYWlyPHZlY3RvcjxpbnQ+LCBwYWlyPGludCwgaW50Pj4gZmluZFplcm9TdW1TdWJhcnJheVdpdGhNb3N0UmVwZWF0ZWRFbGVtZW50KHZlY3RvcjxpbnQ+JiBhcnIpIHsKICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHByZWZpeFN1bU1hcDsgLy8gU3RvcmVzIHByZWZpeCBzdW1zIGFuZCB0aGVpciBmaXJzdCBvY2N1cnJlbmNlIGluZGV4CiAgICBpbnQgcHJlZml4U3VtID0gMDsKICAgIGludCBzdGFydCA9IC0xLCBlbmQgPSAtMTsKICAgIGludCBtYXhGcmVxID0gMCwgbW9zdFJlcGVhdGVkRWxlbWVudCA9IGFyclswXSwgbW9zdFJlcGVhdGVkQ291bnQgPSAwOwoKICAgIHByZWZpeFN1bU1hcFswXSA9IC0xOyAvLyBIYW5kbGVzIGNhc2VzIHdoZXJlIHN1YmFycmF5IHN0YXJ0cyBhdCBpbmRleCAwCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIuc2l6ZSgpOyBpKyspIHsKICAgICAgICBwcmVmaXhTdW0gKz0gYXJyW2ldOwoKICAgICAgICBpZiAocHJlZml4U3VtTWFwLmZpbmQocHJlZml4U3VtKSAhPSBwcmVmaXhTdW1NYXAuZW5kKCkpIHsKICAgICAgICAgICAgaW50IGxlZnRJbmRleCA9IHByZWZpeFN1bU1hcFtwcmVmaXhTdW1dICsgMTsKICAgICAgICAgICAgdmVjdG9yPGludD4gc3ViYXJyYXkoYXJyLmJlZ2luKCkgKyBsZWZ0SW5kZXgsIGFyci5iZWdpbigpICsgaSArIDEpOwoKICAgICAgICAgICAgLy8gQ291bnQgZWxlbWVudCBmcmVxdWVuY2llcyBpbiB0aGlzIHN1YmFycmF5CiAgICAgICAgICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHRlbXBGcmVxOwogICAgICAgICAgICBmb3IgKGludCBudW0gOiBzdWJhcnJheSkgdGVtcEZyZXFbbnVtXSsrOwoKICAgICAgICAgICAgLy8gRmluZCB0aGUgbW9zdCBmcmVxdWVudCBlbGVtZW50CiAgICAgICAgICAgIGZvciAoYXV0byYgW251bSwgZnJlcV0gOiB0ZW1wRnJlcSkgewogICAgICAgICAgICAgICAgaWYgKGZyZXEgPiBtYXhGcmVxKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4RnJlcSA9IGZyZXE7CiAgICAgICAgICAgICAgICAgICAgbW9zdFJlcGVhdGVkRWxlbWVudCA9IG51bTsKICAgICAgICAgICAgICAgICAgICBtb3N0UmVwZWF0ZWRDb3VudCA9IGZyZXE7CiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsZWZ0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZWZpeFN1bU1hcFtwcmVmaXhTdW1dID0gaTsKICAgICAgICB9CiAgICB9CgogICAgdmVjdG9yPGludD4gYmVzdFN1YmFycmF5OwogICAgaWYgKHN0YXJ0ICE9IC0xKSB7CiAgICAgICAgYmVzdFN1YmFycmF5LmFzc2lnbihhcnIuYmVnaW4oKSArIHN0YXJ0LCBhcnIuYmVnaW4oKSArIGVuZCArIDEpOwogICAgfQoKICAgIHJldHVybiB7YmVzdFN1YmFycmF5LCB7bW9zdFJlcGVhdGVkRWxlbWVudCwgbW9zdFJlcGVhdGVkQ291bnR9fTsKfQoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8aW50PiBhcnIgPSB7NCwgMiwgLTMsIDEsIDYsIC0zLCAxLCAzLCAtMiwgLTEsIDQsIC00LCAyfTsKCiAgICBhdXRvIFtzdWJhcnJheSwgZWxlbWVudEluZm9dID0gZmluZFplcm9TdW1TdWJhcnJheVdpdGhNb3N0UmVwZWF0ZWRFbGVtZW50KGFycik7CiAgICBpbnQgbW9zdFJlcGVhdGVkRWxlbWVudCA9IGVsZW1lbnRJbmZvLmZpcnN0OwogICAgaW50IG1vc3RSZXBlYXRlZENvdW50ID0gZWxlbWVudEluZm8uc2Vjb25kOwoKICAgIGNvdXQgPDwgIk9wdGltYWwgWmVyby1TdW0gU3ViYXJyYXk6ICI7CiAgICBmb3IgKGludCBudW0gOiBzdWJhcnJheSkgY291dCA8PCBudW0gPDwgIiAiOwogICAgY291dCA8PCAiXG5Nb3N0IFJlcGVhdGVkIEVsZW1lbnQ6ICIgPDwgbW9zdFJlcGVhdGVkRWxlbWVudCAKICAgICAgICAgPDwgIiAoUmVwZWF0ZWQgIiA8PCBtb3N0UmVwZWF0ZWRDb3VudCA8PCAiIHRpbWVzKSIgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==