big = int(input())
#지도크기
map =[] #전체 지도
save=[] #탐색했던곳의 주소 (튜플로 저장)
sum =0 #단지합 구하는 곳 (x단지에는 sum세대가 있다)
suml=[0] #단지합 모아두는곳. 나중에 소트해서 오름차순출력
sumnum=0 #단지가 몇개인지
for i in range(big):
map.append(1)
#일단 사이즈에 맞는 배열 만들어두고
for i in range(big):
b= str(input())
map[i] = b
#원하는 내용으로 채우기
def checker():
global sum
global big
for i in save:
if int(i[0])-1>=0:
if (int(i[0])-1,int(i[1])) not in save and map[int(i[0])-1][int(i[1])]=='1':
save.append((int(i[0])-1,int(i[1])))
sum+=1
if int(i[0])+1<big:
if (int(i[0])+1,int(i[1])) not in save and map[int(i[0])+1][int(i[1])]=='1':
save.append((int(i[0])+1,int(i[1])))
sum+=1
if int(i[1])-1>=0:
if (int(i[0]),int(i[1])-1) not in save and map[int(i[0])][int(i[1])-1]=='1':
save.append((int(i[0]),int(i[1])-1))
sum+=1
if int(i[1])+1<big:
if (int(i[0]),int(i[1])+1) not in save and map[int(i[0])][int(i[1])+1]=='1':
save.append((int(i[0]),int(i[1])+1))
sum+=1
#한칸의 사방을 확인하고 다시 그 사방을 확인함 save가 계속 커지면서 약간 리커션 느낌인데 정확히 뭐라 불러야 하는지 모르겠음
al=0
be=0
while True:
sum=0
if map[al][be] =='1'and (al,be) not in save:
sum+=1
save.append((al,be))
checker()
sumnum+=1
suml.append(sum)
be+=1
if be==big:
be=0
al+=1
if al==big:
break
#칸마다 보면서 checker() 갈길곳 찾음
del suml[0]
suml.sort()
print(sumnum)
for i in range(len(suml)):
print(suml[i])