Untitled
unknown
c_cpp
a year ago
863 B
14
Indexable
struct node {
ll val;
int counter;
node* next;
node() : val(0), counter(0), next(nullptr) {}
node(ll x) : val(x), counter(0), next(nullptr) {}
};
template<int N>
struct HashMultiset {
node* nodes[N];
HashMultiset() { memset(nodes, 0, sizeof(nodes)); }
pair<node*, node*> find(ll x) {
int i = ((unsigned ll)x) % N;
node* last = nodes[i];
for (node* v = nodes[i]; v; last = v, v = v->next)
if (v->val == x) return make_pair(v, last);
return make_pair(nullptr, last);
}
int count(ll x) {
auto [u, v] = find(x);
return (u ? u->counter : 0);
}
int& operator [](ll x) {
auto [u, v] = find(x);
if (u) return u->counter;
if (!v) {
int i = ((unsigned ll)x) % N;
nodes[i] = new node(x);
return nodes[i]->counter;
}
v->next = new node(x);
return v->next->counter;
}
};Editor is loading...
Leave a Comment