class Solution {
public:
vector<vector<int> > fourSum(vector<int> &num, int target) {
sort(num.begin(), num.end());
vector<vector<int> > vvi;
set<vector<int> > sv;
unordered_map<int, vector<pair<int,int> > > mp;
unordered_map<int, vector<pair<int,int> > >::iterator itr;
for (int i = 0; i < num.size(); ++i) {
for (int j = i + 1; j < num.size(); ++j) {
if (j > i + 1 && num[j] == num[j - 1]) {
continue;
}
int val = target - num[i] - num[j];
itr = mp.find(val);
if (itr != mp.end()) {
vector<pair<int,int> > &vp = itr->second;
for (int k = 0; k < vp.size(); ++k) {
vector<int> match;
match.push_back(vp[k].first);
match.push_back(vp[k].second);
match.push_back(num[i]);
match.push_back(num[j]);
//vvi.push_back(match);
sv.insert(match);
}
}
}
for (int k = 0; k < i; ++k) {
if (k > 0 && num[k] == num[k - 1]) {
continue;
}
int val = num[k] + num[i];
mp[val].push_back(make_pair(num[k], num[i]));
}
}
vvi.insert(vvi.end(), sv.begin(), sv.end());
return vvi;
}
};