// auto-suffixes.c // << Algorithmique du texte >> // Maxime Crochemore, Christophe Hancart et Thierry Lecroq // Vuibert, 2001. #include <stdio.h> #include "chl.h" #include "automate.h" void extension(Lettre a, Automate M) { Etat clone, nouveau, p, q; nouveau = nouvelEtat(); L(nouveau) = L(dernier(M)) + 1; p = dernier(M); do { fixerCible(p, a, nouveau); p = F(p); } while (p != NULL && cible(p, a) == NULL); if (p == NULL) F(nouveau) = initial(M); else { q = cible(p, a); if (L(p) + 1 == L(q)) F(nouveau) = q; else { clone = nouvelEtat(); L(clone) = L(p) + 1; copieCibles(clone, q); F(nouveau) = clone; F(clone) = F(q); F(q) = clone; do { fixerCible(p, a, clone); p = F(p); } while (p != NULL && cible(p, a) == q); } } dernier(M) = nouveau; } Automate autoSuffixes(Mot y, Longueur n) { Automate M; Etat p; M = nouvelAutomate(); L(initial(M)) = 0; F(initial(M)) = NULL; dernier(M) = initial(M); for (; *y != '\0'; ++y) // Extension de M par la lettre *y extension(*y, M); p = dernier(M); do { terminal(p) = VRAI; p = F(p); } while (p != NULL); return(M); }