#include #include #include #include #define DBG 0 int get_line(char *s, int max) { int i; fgets(s,max,stdin); i = strlen(s) - 1; while (i >= 0 && s[i] == '\n') i--; i++; s[i] = 0; return i; } int sgetint(char **s, int *x) { char *t = *s; while (isspace(*t)) t++; if (sscanf(t,"%d",x) != 1) return 0; while (*t && !isspace(*t)) t++; *s = t; return 1; } #define MAXS 10 #define MAXC 7 #define MAX 2000 int d[MAX][MAX]; char code[MAX][MAXC + 3]; int distance(int i, int j) { int x, k; x = 0; for (k = 0; k < MAXC; k++) { if (code[i][k] != code[j][k]) x++; } return x; } int main(void) { int a, b, c; int i, j, k, N; int s, max; while (1) { scanf("%d\n",&N); if (N == 0) break; /* for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { d[i][j] = -1; } } */ for (i = 0; i < N; i++) d[i][i] = 0; for (i = 0; i < N; i++) { get_line(code[i],MAXC + 3); for (j = 0; j < i; j++) { d[i][j] = d[j][i] = distance(i,j); } } #if DBG for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%d %d = %d\n",i,j,d[i][j]); } } #endif for (k = 0; k < N; k++) { for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { a = d[i][k]; b = d[k][j]; c = d[i][j]; a += b; if (a < c) d[i][j] = d[j][i] = a; } } } max = 2000000; for (i = 0; i < N; i++) { s = 0; for (j = 0; j < N; j++) s += d[i][j]; if (s < max) max = s; } printf("The highest possible quality is 1/%d.\n",max); } return 0; }