import java.io.*;
import java.lang.*;
import java.util.*;

class TableHash {

  final static int B = 128 ;
  final static int N = 61 ;
  final static int Nmax = 150 ;
  static String nom[] = new String[Nmax];
  static int tel[] = new int[Nmax];
  static int col[] = new int[Nmax];
  static int n = N;

  static int h (String x) {
  // \esc{Fonction de hachage, voir page \pageref{prog:fonction-hachage}} 

    int   r = 0; 

    for (int i = 0; i < x.length(); ++i)
        r = ((r * B) + x.charAt(i)) % N;
    return r;
  }

  static int recherche (String x) {
  // \esc{Recherche avec hachage, voir page \pageref{prog:recherche-hachage-1}}

    for (int i = h(x); i != -1; i = col[i]) {
        System.out.println (x + ":" + i);
        if (x.equals(nom[i]))
            return tel[i];
    }
    return -1;
  }

  static void insertion (String x, int val) {
  // \esc{Insertion avec hachage, voir page \pageref{prog:insertion-hachage}}

    int   i = h(x);

    if (nom[i] == null) {
        nom[i] = x;
        tel[i] = val;
    } else
    if (n >= Nmax)
        erreur ("Débordement de la table");
    else {
        nom[n] = x;
        tel[n] = val;
        col[n] = col[i];      // \esc{On met la nouvelle entrée en tête}
        col[i] = n;           // \esc{de la liste des collisions de sa} 
        ++n;                  // \esc{classe d'équivalence.} 
    }
  }

  static int rechercheHO (String x) {
 // \esc{Hachage avec adressage ouvert, voir page \pageref{prog:recherche-hachage-ouvert}} 

    int   i = h(x);

    while (nom[i] != null) { 
        if (x.equals(nom[i]))
            return tel[i];
        i = (i+1) % N;
    }
    return -1;
  }

  static void insertionHO (String x, int val) {
    int   i;

    if (n >= N)
        erreur ("De'bordement de la table");
    ++n;
    i = h(x);
    while ((nom[i] != null) && ! x.equals(nom[i]))
        i = (i+1) % N;
    nom[i] = x;
    tel[i] = val;
  }

  static void initialisation() {
    for (int i=0; i < Nmax; ++i) {
        nom[i] = null; col[i] = -1;
    }
  }

  static void imprimer () {
    for (int i=0; i < Nmax; ++i) 
        System.out.println (i + " : " + col[i] + " " + tel[i] + " " + nom[i]);
  }
  public static void main(String args[]) {
      
    initialisation ();
    insertion ("remi", 1);
    insertion ("laurent", 200);
    insertion ("ghis", 301);
    insertion ("ghis", 301);
    imprimer ();
    if (args.length == 1) 
        System.out.println (recherche(args[0]));
    else
        erreur ("Mauvais nombre d'arguments");
  }

  static void erreur (String msg) {
      System.err.println ("test de hachage: " + msg);
      System.exit (1);
  }
}

