///*
//#include<stdio.h>
//#include<stdlib.h>
//#include<string.h>
//int k,value_t;
//int main() {
// int* g_arr;
// scanf("%d",&k);
//
// g_arr = (int*)malloc(sizeof(int) * k);
// for(int i = 0; i < k; i++) {
// scanf("%d",&g_arr[i]);
// }
// Merge_Sort(g_arr ,0 ,k-1);
//
// for(int i = 0; i < k; i++) {
// printf("%d ", g_arr[i]);
// }
//}
//
//void Merge_Sort(int data[], int front, int rear) {
// int middle;
// if(front < rear) {
// middle = (front+rear)/2;
// Merge_Sort(data, front, middle);
// Merge_Sort(data, middle+1, rear);
// Merge(data, front, middle, rear);
// }
//}
//void Merge(int data[], int front, int middle, int rear) {
// int i = front, j = middle+1, l = front;
// int* arr = (int*)malloc(sizeof(int) * k);
// while(i<=middle && j<=rear) {
// if(data[i] <= data[j]) arr[l++] = data[i++];
// else arr[l++] = data[j++];
// }
// while(i<=middle) arr[l++] = data[i++];
// while(j<=rear) arr[l++] = data[j++];
// for(int a = front; a <= rear; a++) data[a] = arr[a];
//}
//*/
//
//#include<stdio.h>
//#include<stdlib.h>
//int main() {
// int n,k,p = 0,max = 0,arrsize;
// int *a_arr,*array;
//
// scanf("%d",&n);
//
// a_arr =(int*)malloc(sizeof(int) * n);
// array =(int*)malloc(sizeof(int) * n);
// for(int i = 0; i < n; i++ ){
// array[i] = 0;
// a_arr[i] = 0;
// }
// for(int i = 0; i < n; i++) {
// scanf("%d",&a_arr[i]);
// if(a_arr[i] %2 == 0 && array[p] >= 0) {
// array[p]++;
// }
// else if(a_arr[i] %2 != 0 && array[p] <= 0) {
// array[p]--;
// }
// else {
// p++;
// if(a_arr[i]%2 == 0) {
// array[p]++;
// }
// else if(a_arr[i]%2 != 0) {
// array[p]--;
// }
// }
// }
// for(int i = 0; i < n; i++) {
// if(array[i] == 0) {
// arrsize=i;
// break;
// }
// if(array[i] * (array[i]>0 ? 1 : -1) > array[max] * (array[max]>0 ? 1 : -1) ){
// max = i;
// }
// }
// printf("%d",max);
// printf("%d",arrsize);
//}
/*
#include<stdio.h>
char data[] = "_3142";
void visit(int number) {
if(number>=strlen(data)) {
return;
}
printf("%c", data[number]);
visit(number*2);
visit(number*2+1);
}
// 1 2 3 4 5 6 7
int main() {
visit(1);
}
*/
//KOI(한국정보올림피아드) 1996 초등부 '단지번호붙이기'
#include<stdio.h>
#include<stdlib.h>
int n,s = 0,m;
int **arr,*stack;
int complex_group(int x,int y) {
//printf("%d %d\n",x,y);
if(x < 0 || x > (n-1) || y < 0 || y > (n-1) || arr[x][y] == 0) {
//printf("%d %d\n",x,y);
return 0;
}
arr[x][y] = 0;
return complex_group(x+1,y) + complex_group(x-1,y)
+ complex_group(x,y+1) + complex_group(x,y-1) + 1;
}
int main() {
scanf("%d",&n);
arr = (int**)malloc(sizeof(int*) * n);
stack = (int*)malloc(sizeof(int) * (n/2+1));
for(int i =0; i <n; i++) {
arr[i] = (int*)malloc(sizeof(int) * n);
for(int j =0; j <n; j++) {
scanf("%1d", &arr[i][j]);
}
}
for(int i =0; i <n; i++) {
for(int j =0; j <n; j++) {
if (arr[i][j]==1) {
m = complex_group(i,j);
if(n > 0) {
stack[s++] = m;
//printf("%d ", m);
}
}
}
}
for(int i=0; i<s-1; i++)
{
for(int j=0;j<s-1;j++)
{
if (stack[j] > stack[j+1])
{
int temp = stack[j];
stack[j] = stack[j+1];
stack[j+1] = temp;
}
}
}
printf("%d",s);
for(int i = 0; i < s; i++) {
printf("\n%d",stack[i]);
}
}