/* matrix mindcoding round 3 */ #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long; #define PII pair #define PCI pair #define VB vector #define VI vector #define VC vector #define WI vector #define WC vector #define RS resize #define X first #define Y second #define FORN(i,n) for(int i=0;i=b;--i) #define REPEAT do #define UNTIL(x) while((x)) #define IN_FILE "date.in" #define OUT_FILE "date.out" ifstream f(IN_FILE); ofstream g(OUT_FILE); //variables int m, n,answer; WI x,sum; //other functions int calc_sum_for_a_rec(PII a1, PII a2) { if (a1.X == 0 || a1.Y == 0) { return -1; } return sum[a2.X][a2.Y] - sum[a2.X][a1.Y - 1] - sum[a1.X - 1][a2.Y] + sum[a1.X - 1][a1.Y - 1]; } int check_neighb(PII loc) { PII loc2 = loc; loc2.X++; loc2.Y++; if (calc_sum_for_a_rec(loc, loc2)>=4) { return true; } loc2 = loc; loc2.X--; loc2.Y--; if (loc.X == 3 && loc.Y == 1) { n--; ++n; } if (calc_sum_for_a_rec(loc2, loc) >= 4) { return true; } loc2 = loc; loc2.X--; loc2.Y++; PII aux; aux.X = loc2.X; aux.Y = loc.Y; loc2.X = loc.X; if (calc_sum_for_a_rec(aux, loc2) >= 4) { return true; } loc2 = loc; loc2.X++; loc2.Y--; aux.X = loc.X; aux.Y = loc2.Y; loc2.Y += 1; if (calc_sum_for_a_rec(aux, loc2) >= 4) { return true; } return false; } void reading() { cin >> n >> m; x.RS(n+2, VI(m+2)); sum.RS(n+2, VI(m+2)); FOR(i, 1, n) { string line; cin >> line; FORN(j, line.length() ) { x[i][j + 1] = line[j] - '0'; } } } void solving() { FOR(i, 1, n) { sum[i][1] += sum[i - 1][1] + x[i][1]; } FOR(i, 2, m) { sum[1][i] += sum[1][i - 1] + x[1][i]; } FOR(i, 2, n) { FOR(j, 2, m) { sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + x[i][j]; } } FOR(i, 1, n) { FOR(j, 1, m) { PII aux; aux.X = i; aux.Y = j; if (check_neighb(aux)) { ++answer; } } } } void write_data() { cout << answer; } int main() { reading(); solving(); write_data(); }