#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ERREUR_ARGUMENTS 1

typedef unsigned char uchar;
typedef unsigned int uint;

typedef uint * tperm;
typedef char * tmot;
typedef tmot * tliste;

// Renvoie la permutation identite du groupe des permutations de degré n
tperm CreerPermId(uint n){
  //--------- A COMPLETER ----------------
  
}

// Trie la liste de mots passee en parametre sur place dans
// l'ordre lexicographique et renvoie la permutation sigma des
// indice qui a permis de la trier.
tperm TriGlobal(tliste liste, uint nbmots){
  //--------- A COMPLETER ----------------

}


// Renvoie une copie du mot passé en paramètre dont
// les lettres ont été triées dans l'ordre alphabétique.
// Exemple: "eiprs" pour "prise".
tmot TriAlpha(tmot mot){
  //--------- A COMPLETER ----------------

}

// Renvoie une nouvelle liste contenant les mots dont les mots
// ont été triées à partir des mots de la liste passée en paramètre
tliste TriLocal(tliste liste, uint nbmots, uchar *lmax){
  //--------- A COMPLETER ----------------

}

// Affiche la liste L passée en paramètre si la permutation
// sigma passée en paramètre est le tableau NULL ou la liste
// L°sigma sinon.   
void AfficherListe(tliste liste, tperm sigma, uint nbmots){
  for (uint i = 0; i < nbmots; i++)
    if (sigma == NULL)
      printf("%s ",liste[i]);
    else
      printf("%s ",liste[sigma[i]]);
  printf("\n");
}

// Affiche les classes d'équivalence des mots de la liste
// passée en paramètre pour la relation binaire u R v
// si et seulement si v est une anagramme de u.
void Partitionner(tliste liste, tliste ielst, tperm perm, uint nbmots){
  //--------- A COMPLETER ----------------

}

void AfficherPerm(tperm perm, uint n){
  for (uint i = 0; i < n; i++)
    printf("%d ",perm[i] + 1);
  printf("\n");
}

int main(int argc,char *argv[]){
  tliste liste = NULL;
  tliste ielst = NULL;
  uint nbmots = 0;
  tperm perm = NULL;
  
  if (argc < 2){
    printf("Syntaxe: %s mots\n",argv[0]);
    return ERREUR_ARGUMENTS;
  }
  
  liste = argv + 1;
  nbmots = argc - 1;
  AfficherListe(liste,perm,nbmots);
  //------- COMPLETER ICI -----------



  
  //---------------------------------
  return 0;
}
