Pagini recente » Cod sursa (job #1120386) | Cod sursa (job #1485590) | Cod sursa (job #2862721) | Cod sursa (job #2279735) | Cod sursa (job #1245718)
#include <fstream>
#include <vector>
#include <forward_list>
#include <cassert>
class MySet
{
public:
MySet(std::size_t size);
void add(long long value);
bool contains(long long value) const;
void remove(long long value);
private:
std::size_t hash(long long value) const;
std::size_t size_;
std::vector< std::forward_list<long long> > ht_;
};
MySet::MySet(std::size_t size)
: size_(size)
{
ht_.reserve(size);
}
void MySet::add(long long value)
{
if (contains(value))
return;
ht_[hash(value)].push_front(value);
}
bool MySet::contains(long long value) const
{
assert(hash(value) < size_);
const std::forward_list<long long> &curr_list = ht_[hash(value)];
for (auto &i : curr_list) {
if (i == value)
return true;
}
return false;
}
void MySet::remove(long long value)
{
ht_[hash(value)].remove(value);
}
std::size_t MySet::hash(long long value) const
{
value *= 357913941;
value ^= value << 24;
value += ~357913941;
value ^= value >> 31;
value ^= value << 31;
return value % size_;
}
int main()
{
std::ifstream fin("hashuri.in");
std::ofstream fout("hashuri.out");
std::size_t N;
fin >> N;
MySet set(N);
for (; N; --N) {
int type;
long long nr;
fin >> type >> nr;
if (type == 1)
set.add(nr);
else if (type == 2 && set.contains(nr))
set.remove(nr);
else if (type == 3)
fout << (set.contains(nr) ? "1\n" : "0\n");
}
fin.close();
fout.close();
return 0;
}