class Solution {
public:
void gen(const vector<int> &nums, int p, vector<vector<int> >&sets, vector<int> &set) {
int n = nums.size();
if (n == p) {
sets.push_back(set);
return ;
}
int tail = p;
while (tail < n && nums[tail] == nums[p]) {
++tail;
}
gen(nums, tail, sets, set);
for (int i = p; i < tail; ++i) {
set.push_back(nums[p]);
gen(nums, tail, sets, set);
}
for (int i = p; i < tail; ++i) {
set.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int> > sets;
vector<int> set;
gen(nums, 0, sets, set);
return sets;
}
};