/*
#include <stdio.h>
void rec(int n)
{
if(n>26) rec((n-1)/26);
printf("%c", (n-1)%26 + 'A');
}
int main()
{
int n;
scanf("%d", &n);
rec(n);
}
*/
#include <stdio.h>
int a[26][26];
int n;
int c[625]={};
void dfs(int x, int y, int cnt) //a[x][y]에서 dfs를 해라
{
if(x<1||x>n||y<1||y>n||a[x][y]!=1) return ;
a[x][y]=-1;
c[cnt]++;
dfs(x, y+1, cnt);
dfs(x+1, y, cnt);
dfs(x, y-1, cnt);
dfs(x-1, y, cnt);
}
int main()
{
int cnt=0;
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
scanf("%1d", &a[i][j]);
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(a[i][j]==1)
{
cnt++;
dfs(i,j, cnt);
}
}
}
printf("%d\n",cnt);
for(int i=1; i<=cnt; i++)
printf("%d\n", c[i]);
//배열 c[] 정렬하기!!
}
/*
#include <stdio.h>
int w, h;
char a[101][101]={};
void dfs(int x, int y)
{
if( x<1||x>h||y<1||y>w|| a[x][y]!='L' ) return;
a[x][y] = 0;
dfs(x, y+1);
dfs(x+1, y);
dfs(x-1, y);
dfs(x, y-1);
dfs(x+1, y+1);
dfs(x+1, y-1);
dfs(x-1, y+1);
dfs(x-1, y-1);
}
int main()
{
int count=0;
scanf("%d %d", &w, &h);
for(int i=1; i<=h; i++)
{
for(int j=1; j<=w; j++)
scanf(" %c", &a[i][j]); //문자열로 받으므로 ' '까지 포함해서 받기(처음엔 enter 포함됨)
}
for(int i=1; i<=h; i++)
{
for(int j=1; j<=w; j++)
{
if(a[i][j]=='L')
{
count++;
dfs(i,j);
}
}
}
printf("%d", count);
}
#include <stdio.h>
int a[8][8]={};
int c=0;
void dfs(int x, int y, int color)
{
if(x<1||x>7||y<1||y>7||a[x][y]!=color) return;
a[x][y] = 0;
c++;
dfs(x, y+1, color);
dfs(x+1, y, color);
dfs(x, y-1, color);
dfs(x-1, y, color);
}
int main()
{
int count=0;
for(int i=1; i<=7; i++)
{
for(int j=1; j<=7; j++)
scanf("%d", &a[i][j]);
}
for(int i=1; i<=7; i++)
{
for(int j=1; j<=7; j++)
{
if(a[i][j]!=0)
{
c=0;
dfs(i,j,a[i][j]);
if(c>=3) count++;
}
}
}
printf("%d", count);
}
*/