#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define vint vector::iterator #define vintp vector >::iterator #define ll long long #define inf 1000000 #define maxn 251 #define mod 329885391853LL using namespace std; ifstream fin ("A.in"); ofstream fout("A.out"); char s[1001][1001]; vector G[300001]; vector CB[300001]; int vis[300001],stack[300001],lvl[300001],nrb,t,n,nn,m,wh[501][501]; int counted[300001]; int dfs (int x) { vis[x]=1; stack[++t] = x; int lowlink=inf,child_lowlink; lvl[x]=t; for (vector ::iterator it=G[x].begin();it!=G[x].end(); ++it) { if (!vis[*it]) { child_lowlink=inf; child_lowlink = min (child_lowlink,dfs(*it)); if (child_lowlink >= lvl[x]) { ++nrb; for (; stack[t]!=*it; --t) { CB[nrb].push_back (stack[t]); } CB[nrb].push_back(stack[t]); --t; CB[nrb].push_back(x); } lowlink = min (lowlink,child_lowlink); } else { lowlink = min (lowlink,lvl[*it]); } } return lowlink; } int main() { cin>>nn>>m; for (int i=1; i<=nn; ++i) cin>>s[i]+1; for (int i=1; i<=nn; ++i) for (int j=1; j<=m; ++j) { if (s[i][j] == '1') { wh[i][j] = ++n; } } for (int i=1; i<=nn; ++i) for (int j=1; j<=m; ++j) { if (s[i][j] == '1') { if (i != nn && s[i+1][j] == '1') { G[wh[i][j]].push_back (wh[i+1][j]); G[wh[i+1][j]].push_back (wh[i][j]); } if (j != m && s[i][j+1] == '1') { G[wh[i][j]].push_back (wh[i][j+1]); G[wh[i][j+1]].push_back (wh[i][j]); } } } for (int i=1; i<=n; ++i) { if (!vis[i]) dfs (i); } int s=0; for (int i=1; i<=nrb; ++i) { if (CB[i].size() >= 4) { for (vint it = CB[i].begin(); it != CB[i].end(); ++it) if (!counted[*it]) { ++s; counted[*it] = 1; } } } cout<