Pagini recente » Cod sursa (job #1928373) | Cod sursa (job #2442576) | Cod sursa (job #1612207) | Cod sursa (job #1700156) | Cod sursa (job #982796)
Cod sursa(job #982796)
#include <fstream>
#include <list>
#include <ctime>
#include <cstdlib>
const int MOD = 666013;
class Hash
{
std::list<int> *nArr;
int size;
int table;
int a;
int b;
int getHash(int key)
{
return ((a * key + b) % MOD) % table;
}
public:
Hash() : size(0), table(2048), a(rand() % (MOD - 1) + 1), b(rand() % MOD), nArr(new std::list<int>[2048])
{ }
~Hash()
{
delete[] nArr;
}
bool find(int key)
{
for(std::list<int>::iterator it = nArr[getHash(key)].begin(); it != nArr[getHash(key)].end(); it++)
if (*it == key) return true;
return false;
}
void insert(int key)
{
if(find(key)) return;
size++;
if(table == size)
{
std::list<int> *cArr = new std::list<int>[table * 2];
table *= 2;
a = rand() % (MOD - 1) + 1;
b = rand() % MOD;
for(int i = 0; i < table / 2; i++)
{
while(!nArr[i].empty())
{
int cKey = nArr[i].front();
nArr[i].pop_front();
cArr[getHash(cKey)].push_back(cKey);
}
}
cArr[getHash(key)].push_back(key);
delete[] nArr;
nArr = cArr;
cArr = NULL;
}
else nArr[getHash(key)].push_back(key);
}
void deletes(int key)
{
if(!find(key)) return;
size--;
if(table / 4 >= size && table > 2048)
{
std::list<int> *cArr = new std::list<int>[table * 2];
table /= 2;
a = rand() % (MOD - 1) + 1;
b = rand() % MOD;
for(int i = 0; i < table * 2; i++)
{
while(!nArr[i].empty())
{
int cKey = nArr[i].front();
nArr[i].pop_front();
if(cKey != key) cArr[getHash(cKey)].push_back(cKey);
}
}
delete[] nArr;
nArr = cArr;
cArr = NULL;
}
else nArr[getHash(key)].remove(key);
}
};
int main()
{
srand(time(NULL));
std::ifstream in("hashuri.in");
std::ofstream out("hashuri.out");
Hash myH;
int nV, a;
int b;
in >> nV;
for(int i = 0; i < nV; i++)
{
in >> a >> b;
if(a == 1) myH.insert(b);
else if(a == 2) myH.deletes(b);
else out << myH.find(b) << '\n';
}
return 0;
}