class Solution {
void fun(vector<vector<int> >&ans, vector<int> S, vector<int> t, int cur)
{
if (cur == S.size())
{
ans.push_back(t); return;
}
if (count(t.begin(), t.end(), S[cur]) == (S.begin() + cur - lower_bound(S.begin(), S.end(), S[cur])))
{
t.push_back(S[cur]);
fun(ans, S, t, cur + 1);
t.erase(t.end() - 1);
} fun(ans, S, t, cur + 1);
}
public:
/**
* @param S: A set of numbers.
* @return: A list of lists. All valid subsets.
*/
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > ans;
vector<int> t;
sort(S.begin(), S.end());
fun(ans, S, t, 0);
return ans;
}
};