#include #include #include using namespace std; const int MAXSIZE = 281010; const int MAXN = 510; int n, m, v[MAXN][MAXN]; int dx[4] = {-1, 0, 0, 1}; int dy[4] = {0, 1, -1, 0}; bool is_okay (int x, int y) { if (x < 0 || x > n) return 0; if (y < 0 || y > m) return 0; return 1; } vector g[MAXSIZE]; vector c[MAXSIZE]; int stiva[MAXSIZE], how_high[MAXSIZE], p[MAXSIZE]; int viz[MAXSIZE], sd, t; #define pb push_back void adauga(int nod) { ++t; while(stiva[sd] != nod) { c[t].pb(stiva[sd]); --sd; } c[t].pb(stiva[sd]); --sd; } void dfs(int nod, int bk) { viz[nod] = 1; stiva[++sd] = nod; p[nod] = p[bk] + 1; how_high[nod] = p[nod]; int mlev = p[nod], i; for(i = 0; i < g[nod].size(); ++i) { if(viz[g[nod][i]]) mlev = min(mlev, p[g[nod][i]]); else { dfs(g[nod][i], nod); how_high[nod] = min(how_high[nod], how_high[g[nod][i]]); if(how_high[g[nod][i]] == p[nod]) { adauga(g[nod][i]); c[t].pb(nod); } } } how_high[nod] = min(how_high[nod], mlev); } int main() { //freopen("c.in", "r", stdin); cin >> n >> m; for (int i = 1; i <= n; ++i) { cin.get(); for (int j = 1; j <= m; ++j) { char c = cin.get(); v[i][j] = (c == '1'); } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { int nr = i * 501 + j; if (v[i][j] == 0) continue; for (int k = 0; k < 4; ++k) { int nx = i + dx[k]; int ny = j + dy[k]; if (is_okay(nx, ny) && v[nx][ny]) { int nr2 = nx * 501 + ny; g[nr].push_back(nr2); } } } } int maxNr = n * 501 + m; for (int i = 1; i <= maxNr; ++i) dfs (i, 0); int rez = 0; for (int i = 1; i <= t; ++i) { if (c[i].size() >= 4) rez += c[i].size(); } cout << rez; return 0; }