// assoc.C   (simplified from Stroustrup 7.7)

#include <iostream.h>
#include <string.h>
#include <assert.h>

class assoc {
public:
  assoc(int=100);
  ~assoc();
  int& operator[] (const char*);
  int num_items() {return nitems;}
  friend ostream& operator<< (ostream&, const assoc&);
private:
  struct pair {
    char* name;
    int val;
  };
  pair *vec;
  int maxitems; 
  int nitems; 
};

assoc::assoc(int n) {nitems=0; maxitems=n; vec=new pair[n];}

assoc::~assoc() {
  for (int i=0; i<nitems; i++) {
    delete [] vec[i].name;
  }
  delete [] vec;
}

int& assoc::operator[] (const char* p) 
{
  for (int i=0; i<nitems; i++)
    if (strcmp(p, vec[i].name)==0) return vec[i].val;
  if (nitems==maxitems) assert(0);
  vec[nitems].name=new char[strlen(p)+1];
  strcpy(vec[nitems].name,p);
  vec[nitems].val=0;
  nitems++;
  return vec[nitems-1].val;
}


ostream& operator<< (ostream& os, const assoc& a)
{
  for (int i=0; i<a.nitems; i++)
    os << a.vec[i].name <<": " << a.vec[i].val << "\n";
  return os;
}




main()
{
  char x[256];
  assoc a;                      // or a(20);
  while (cin>>x) a[x]++;
  cout << a << "\n" << a.num_items() << " items\n";
}

