#include using namespace std; //#define int long long typedef long long ll; typedef pairpint; typedef vectorvint; typedef vectorvpint; #define pb push_back #define mp make_pair #define fi first #define se second #define all(v) (v).begin(),(v).end() #define rep(i,n) for(int i=0;i<(n);i++) #define reps(i,f,n) for(int i=(f);i<(n);i++) #define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++) templatevoid chmin(T &t,U f){if(t>f)t=f;} templatevoid chmax(T &t,U f){if(t=H||nx<0||nx>=W||used[ny][nx]||fld[ny][nx]=='.')continue; dfs(ny,nx); } } int dp[1000000][2]; void solve(int v,int p){ dp[v][0]=0;dp[v][1]=sz[v]; rep(i,G[v].size()){ int to=G[v][i]; if(to==p)continue; solve(to,v); dp[v][0]+=max(dp[to][0],dp[to][1]); dp[v][1]+=dp[to][0]; } } signed main(){ scanf("%d%d",&H,&W); rep(i,H)scanf("%s",fld[i]); memset(C,-1,sizeof(C)); rep(i,H)rep(j,W)if(!used[i][j]&&fld[i][j]=='x'){ dfs(i,j); N++; } fill_n(isroot,N,1); rep(i,H){ stackS; mapM,MM; rep(j,W)if(C[i][j]!=-1)M[C[i][j]]=j; for(int j=W-1;j>=0;j--)if(C[i][j]!=-1)MM[C[i][j]]=j; rep(j,W){ if(C[i][j]==-1)continue; if(MM[C[i][j]]==j){ if(isroot[C[i][j]]&&S.size()){ G[S.top()].pb(C[i][j]); G[C[i][j]].pb(S.top()); isroot[C[i][j]]=0; } S.push(C[i][j]); } if(M[C[i][j]]==j){ assert(S.size()); S.pop(); } } } int ans=0; rep(i,N)if(isroot[i]){ solve(i,-1); ans+=max(dp[i][0],dp[i][1]); } printf("%d\n",ans); return 0; }