#include<iostream> #include<cstring> #include<algorithm> #include<stdio.h> using namespace std; const int INF=0x3f3f3f3f; const int N=2010; int n; int p[N]; char str[N][8]; int num=0; struct edge{ int a,b; int w; }e[N*N]; bool cmp(edge a,edge b) { return a.w<b.w; } int find(int x) { if(p[x]!=x) p[x]=find(p[x]); return p[x]; } int dist(int i,int j) { int w=0; for(int k=0;k<7;k++) if(str[i][k]!=str[j][k]) w++; return w; } int kruskal() { sort(e,e+num,cmp); int sum=0; for(int i=0;i<num;i++) { int a=find(e[i].a); int b=find(e[i].b); int w=e[i].w; if(a!=b) { p[a]=b; sum+=w; } } return sum; } int main() { while(cin>>n&&n) { num=0; for(int i=1;i<=n;i++) p[i]=i; for(int i=1;i<=n;i++) cin>>str[i]; for(int i=1;i<=n-1;i++) for(int j=i+1;j<=n;j++) e[num++]={i,j,dist(i,j)}; cout<<"The highest possible quality is 1/"<<kruskal()<<'.'<<endl; } }