#include <bits/stdc++.h>
using namespace std;
vector<string> todos(10050);
map<string, set<string> > carpetas;
map<string, set<string> > archivos;
map<string, int> indices;
int cont;
int res1, res2;
int R1[10050], R2[10050];
void go(int ind) {
  int a = carpetas[todos[ind]].size();
  int b = archivos[todos[ind]].size();
  set<string>::iterator it;
  for (it = carpetas[todos[ind]].begin(); it != carpetas[todos[ind]].end();
       it++) {
    if (R1[indices[*it]] == -1) go(indices[*it]);
    a += R1[indices[*it]];
    b += R2[indices[*it]];
  }
  R1[ind] = a;
  R2[ind] = b;
  return;
}
void dame(string cad, string &A, vector<string> &v, string &ar) {
  A = "";
  int c = 0;
  int i = 0;
  for (; i < cad.size(); i++) {
    if (cad[i] == '\\') c++;
    A += cad[i];
    if (c == 2) break;
  }
  string cur = A;
  v.clear();
  i++;
  for (; i < cad.size(); i++) {
    cur += cad[i];
    if (cad[i] == '\\') {
      v.push_back(cur);
    }
  }
  ar = cur;
}
int main() {
  memset(R1, -1, sizeof R1);
  memset(R2, -1, sizeof R2);
  cont = 0;
  string cad;
  indices.clear();
  carpetas.clear();
  archivos.clear();
  string archivo;
  vector<string> otro;
  string inicio;
  while (cin >> cad) {
    dame(cad, inicio, otro, archivo);
    if (indices.find(inicio) == indices.end()) {
      todos[cont] = inicio;
      indices[inicio] = cont++;
    }
    string cur = inicio;
    for (int i = 0; i < otro.size(); i++) {
      carpetas[cur].insert(otro[i]);
      cur = otro[i];
      if (indices.find(cur) == indices.end()) {
        todos[cont] = cur;
        indices[cur] = cont++;
      }
      cur = otro[i];
    }
    archivos[cur].insert(archivo);
  }
  res1 = 0;
  res2 = 0;
  for (int i = 0; i < cont; i++) {
    if (R1[i] == -1) go(i);
  }
  for (int i = 0; i < cont; i++) {
    res1 = max(res1, R1[i]);
    res2 = max(res2, R2[i]);
  }
  cout << res1 << " " << res2 << endl;
  return 0;
}
