Untitled

 avatar
unknown
c_cpp
10 months 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