#include <stdio.h>
void answer(int count) {
}
#define Y_SIZE (300)
#define X_SIZE (300)
// 線分; あるセルから正方向に空き状態、または埋め状態が連続する領域
typedef struct {
int len; // 長さ
int crs_emp_seg_len_min; // 直交する空き線分の長さの最小値
int crs_emp_seg_len_max; // 直交する空き線分の長さの最大値
} SEGMENT;
int H; // ホーム画面縦の区画数
int W; // ホーム画面横の区画数
int array[Y_SIZE][X_SIZE]; // ホーム画面の配置
SEGMENT hori_segs[Y_SIZE][X_SIZE]; // 水平方向の線分
SEGMENT vert_segs[Y_SIZE][X_SIZE]; // 垂直方向の線分
int cache[Y_SIZE][X_SIZE]; // 答えのキャッシュ
int // 答え
resolve_hori(S, T)
int S; // ウィジェットの縦サイズ
int T; // ウィジェットの横サイズ
{
int count, len;
int x, y;
count = 0;
for (y = 0; y <= H - S; y++) {
for (x = 0; x < W;) {
if (array[y][x]) {
x += hori_segs[y][x].len;
} else if (hori_segs[y][x].len >= T) {
if (hori_segs[y][x].crs_emp_seg_len_min >= S) {
count += hori_segs[y][x].len - T + 1;
x += hori_segs[y][x].len + 1;
} else if (hori_segs[y][x].crs_emp_seg_len_max < S) {
x += hori_segs[y][x].len + 1;
} else {
for (len = 0; len < hori_segs[y][x].len && vert_segs[y][x + len].len >= S; len++);
if (len >= T) {
count += len - T + 1;
}
x += len + 1;
}
} else {
x += hori_segs[y][x].len + 1;
}
}
}
return count;
}
int // 答え
resolve_vert(S, T)
int S; // ウィジェットの縦サイズ
int T; // ウィジェットの横サイズ
{
int count, len;
int x, y;
count = 0;
for (x = 0; x <= W - T; x++) {
for (y = 0; y < H;) {
if (array[y][x]) {
y += vert_segs[y][x].len;
} else if (vert_segs[y][x].len >= S) {
if (vert_segs[y][x].crs_emp_seg_len_min >= T) {
count += vert_segs[y][x].len - S + 1;
y += vert_segs[y][x].len + 1;
} else if (vert_segs[y][x].crs_emp_seg_len_max < T) {
y += vert_segs[y][x].len + 1;
} else {
for (len = 0; len < vert_segs[y][x].len && hori_segs[y + len][x].len >= T; len++);
if (len >= S) {
count += len - S + 1;
}
y += len + 1;
}
} else {
y += vert_segs[y][x].len + 1;
}
}
}
return count;
}
void resolve(S, T)
int S; // ウィジェットの縦サイズ
int T; // ウィジェットの横サイズ
{
if (cache[S - 1][T - 1] < 0) {
if (S < T) {
cache[S - 1][T - 1] = resolve_hori(S, T);
} else {
cache[S - 1][T - 1] = resolve_vert(S, T);
}
}
answer(cache[S - 1][T - 1]);
}
int main(void) {
char str[305];
int N, s, t;
int x, y, i;
int fill, len, len_min, len_max;
for (y = 0; y < H; y++) {
for (x = 0; x < W; x++) {
array[y][x] = (int)(str[x] - '0');
}
}
for (y = 0; y < H; y++) {
fill = 0;
len = 0;
for (x = W - 1; x >= 0; x--) {
if (array[y][x] == fill) {
len++;
} else {
fill = array[y][x];
len = 1;
}
hori_segs[y][x].len = len;
}
}
for (x = 0; x < W; x++) {
fill = 0;
len = 0;
for (y = H - 1; y >= 0; y--) {
if (array[y][x] == fill) {
len++;
} else {
fill = array[y][x];
len = 1;
}
vert_segs[y][x].len = len;
}
}
for (y = 0; y < H; y++) {
len_min = Y_SIZE;
len_max = 0;
for (x = W - 1; x >= 0; x--) {
if (array[y][x]) {
len_min = Y_SIZE;
len_max = 0;
} else {
if (vert_segs[y][x].len < len_min) {
len_min = vert_segs[y][x].len;
}
if (vert_segs[y][x].len > len_max) {
len_max = vert_segs[y][x].len;
}
hori_segs[y][x].crs_emp_seg_len_min = len_min;
hori_segs[y][x].crs_emp_seg_len_max = len_max;
}
}
}
for (x = 0; x < W; x++) {
len_min = X_SIZE;
len_max = 0;
for (y = H - 1; y >= 0; y--) {
if (array[y][x]) {
len_min = X_SIZE;
len_max = 0;
} else {
if (hori_segs[y][x].len < len_min) {
len_min = hori_segs[y][x].len;
}
if (hori_segs[y][x].len > len_max) {
len_max = hori_segs[y][x].len;
}
vert_segs[y][x].crs_emp_seg_len_min = len_min;
vert_segs[y][x].crs_emp_seg_len_max = len_max;
}
}
}
for (y = 0; y < H; y++) {
for (x = 0; x < W; x++) {
cache[y][x] = -1;
}
}
for (i = 0; i < N; i++) {
resolve(s, t);
}
return 0;
}