#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 1e3 + 5;
long long n,m;
long long visited[MaxN][MaxN];
long long dx[5]={0,1,0,-1};
long long dy[5]={1,0,-1,0};
char a[MaxN][MaxN];
long long bfs(long long i, long long j, char a[][MaxN], long long visited[][MaxN])
{
queue<pair<long long,long long>> qu;
qu.push({i,j});
visited[i][j]=true;
long long cnt=0;
if(a[i][j]=='x')
{
cnt++;
}
while(!qu.empty())
{
long long x=qu.front().first;
long long y=qu.front().second;
qu.pop();
for(long long t=0;t<4;t++)
{
long long newx=x+dx[t];
long long newy=y+dy[t];
if(newx<1||newy<1||newx>n||newy>m)
{
continue;
}
if(a[newx][newy]!='#'&&visited[newx][newy]==-1)
{
visited[newx][newy]=true;
if(a[newx][newy]=='x')
{
cnt++;
}
qu.push({newx,newy});
}
}
}
return cnt;
}
void input()
{
cin>>n>>m;
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
cin>>a[i][j];
visited[i][j]=-1;
}
}
}
void solve()
{
vector<long long> res;
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
if(a[i][j]!='#'&&visited[i][j]==-1)
{
long long cnt=bfs(i,j,a,visited);
if(cnt>0)
{
res.push_back(cnt);
}
}
}
}
sort(res.begin(),res.end());
for(long long x:res)
{
cout<<x<<" ";
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
input();
solve();
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGxvbmcgbG9uZyBNYXhOID0gMWUzICsgNTsKCmxvbmcgbG9uZyBuLG07CmxvbmcgbG9uZyB2aXNpdGVkW01heE5dW01heE5dOwpsb25nIGxvbmcgZHhbNV09ezAsMSwwLC0xfTsKbG9uZyBsb25nIGR5WzVdPXsxLDAsLTEsMH07CgpjaGFyIGFbTWF4Tl1bTWF4Tl07Cgpsb25nIGxvbmcgYmZzKGxvbmcgbG9uZyBpLCBsb25nIGxvbmcgaiwgY2hhciBhW11bTWF4Tl0sIGxvbmcgbG9uZyB2aXNpdGVkW11bTWF4Tl0pCnsKICAgIHF1ZXVlPHBhaXI8bG9uZyBsb25nLGxvbmcgbG9uZz4+IHF1OwoKICAgIHF1LnB1c2goe2ksan0pOwogICAgdmlzaXRlZFtpXVtqXT10cnVlOwoKICAgIGxvbmcgbG9uZyBjbnQ9MDsKCiAgICBpZihhW2ldW2pdPT0neCcpCiAgICB7CiAgICAgICAgY250Kys7CiAgICB9CgogICAgd2hpbGUoIXF1LmVtcHR5KCkpCiAgICB7CiAgICAgICAgbG9uZyBsb25nIHg9cXUuZnJvbnQoKS5maXJzdDsKICAgICAgICBsb25nIGxvbmcgeT1xdS5mcm9udCgpLnNlY29uZDsKICAgICAgICBxdS5wb3AoKTsKCiAgICAgICAgZm9yKGxvbmcgbG9uZyB0PTA7dDw0O3QrKykKICAgICAgICB7CiAgICAgICAgICAgIGxvbmcgbG9uZyBuZXd4PXgrZHhbdF07CiAgICAgICAgICAgIGxvbmcgbG9uZyBuZXd5PXkrZHlbdF07CgogICAgICAgICAgICBpZihuZXd4PDF8fG5ld3k8MXx8bmV3eD5ufHxuZXd5Pm0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihhW25ld3hdW25ld3ldIT0nIycmJnZpc2l0ZWRbbmV3eF1bbmV3eV09PS0xKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aXNpdGVkW25ld3hdW25ld3ldPXRydWU7CgogICAgICAgICAgICAgICAgaWYoYVtuZXd4XVtuZXd5XT09J3gnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHF1LnB1c2goe25ld3gsbmV3eX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBjbnQ7Cn0KCnZvaWQgaW5wdXQoKQp7CiAgICBjaW4+Pm4+Pm07CgogICAgZm9yKGxvbmcgbG9uZyBpPTE7aTw9bjtpKyspCiAgICB7CiAgICAgICAgZm9yKGxvbmcgbG9uZyBqPTE7ajw9bTtqKyspCiAgICAgICAgewogICAgICAgICAgICBjaW4+PmFbaV1bal07CiAgICAgICAgICAgIHZpc2l0ZWRbaV1bal09LTE7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHNvbHZlKCkKewogICAgdmVjdG9yPGxvbmcgbG9uZz4gcmVzOwoKICAgIGZvcihsb25nIGxvbmcgaT0xO2k8PW47aSsrKQogICAgewogICAgICAgIGZvcihsb25nIGxvbmcgaj0xO2o8PW07aisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoYVtpXVtqXSE9JyMnJiZ2aXNpdGVkW2ldW2pdPT0tMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9uZyBsb25nIGNudD1iZnMoaSxqLGEsdmlzaXRlZCk7CgogICAgICAgICAgICAgICAgaWYoY250PjApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2hfYmFjayhjbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHNvcnQocmVzLmJlZ2luKCkscmVzLmVuZCgpKTsKCiAgICBmb3IobG9uZyBsb25nIHg6cmVzKQogICAgewogICAgICAgIGNvdXQ8PHg8PCIgIjsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKCiAgICBpbnB1dCgpOwogICAgc29sdmUoKTsKfQ==