1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
uint8_t *data;
int rows;
int columns;
int cap;
} Mat;
char buf[4096];
int get(Mat *m, int row, int column) {
return m->data[row * m->columns + column];
}
int score(Mat *m, int i, int j) {
int height = get(m, i, j);
int s = 1;
int count = 0;
for (int p = i - 1; p >= 0; p--) {
count++;
if (get(m, p, j) >= height) break;
}
s *= count;
count = 0;
for (int p = i + 1; p < m->rows; p++) {
count++;
if (get(m, p, j) >= height) break;
}
s *= count;
count = 0;
for (int p = j - 1; p >= 0; p--) {
count++;
if (get(m, i, p) >= height) break;
}
s *= count;
count = 0;
for (int p = j + 1; p < m->columns; p++) {
count++;
if (get(m, i, p) >= height) break;
}
s *= count;
return s;
}
int main() {
Mat m;
m.data = malloc(4096);
m.cap = 4096;
m.rows = 0;
m.columns = 0;
FILE *fp = fopen("input", "r");
while(fgets(buf, 4096, fp)) {
int len = strlen(buf);
if (len <= 1) break;
if (m.columns == 0) m.columns = len - 1;
while (m.cap < (m.rows + 1) * m.columns) {
m.data = realloc(m.data, m.cap * 2);
m.cap *= 2;
}
memcpy(m.data + m.rows * m.columns, buf, m.columns);
m.rows++;
}
int maxscore = -1;
for (int i = 0; i < m.rows; i++) {
for (int j = 0; j < m.columns; j++) {
int s = score(&m, i, j);
if (s > maxscore) maxscore = s;
}
}
printf("%d", maxscore);
return 0;
}
|