#include #include using namespace std; #define MAX 201 #define MAXN 0xffffff int map[MAX][MAX],link[MAX],dx[MAX],dy[MAX]; bool visx[MAX],visy[MAX]; int n,lack; char A[201][10001]; bool DFS(int v) { visx[v]=true; for(int i=1;i<=n;i++) { if(visy[i]) continue; int t=dx[v]+dy[i]-map[v][i]; if(!t) { visy[i]=true; if(link[i]==-1||DFS(link[i])) { link[i]=v; return true; } } else { if(tdx[i]) dx[i]=map[i][j]; } for(i=1;i<=n;i++) { while(true) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); lack=MAXN; if(DFS(i)) break; for(j=1;j<=n;j++) { if(visx[j]) dx[j]-=lack; if(visy[j]) dy[j]+=lack; } } } int ans=0; for(i=1;i<=n;i++) ans+=map[link[i]][i]; cout<=0&&A[i][q]==A[j][p]) { q++;p--; } map[i][j]=q; } } } } int main() { while(cin>>n) { int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=0; } for(i=1;i<=n;i++) scanf("%s",A[i]); Q(); KM(); } return 0; }