条件に合うように2つのグループに分ける。
あとは、割り当て方が何通りあるかを計算する。
class Zoo {
public:
long long theCount(vector <int> ans)
{
vector<int> a, b;
map<int, int> cnt;
for (int i = 0; i < (int)ans.size(); ++i) {
if (cnt[ans[i]]) b.push_back(ans[i]);
else a.push_back(ans[i]);
if (2 < ++cnt[ans[i]]) return 0;
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
for (int i = 0; i < (int)a.size(); ++i) {
if (binary_search(a.begin(), a.end(), i)) ;
else return 0;
}
for (int i = 0; i < (int)b.size(); ++i) {
if (binary_search(b.begin(), b.end(), i)) ;
else return 0;
}
if (a.empty() || b.empty()) return 2;
lli ret = 1LL << (min(a.size(), b.size()) + (a.size() != b.size()));
return ret;
}
};