Submission #60013646
Source Code Expand
Copy
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MOD_BY 998244353int add(int a, int b) {return a + b - MOD_BY * (a + b >= MOD_BY);}struct node_s {int value;struct node_s *next[2];};int* getValuePtr(struct node_s** node, int key) {if (*node == NULL) {*node = malloc(sizeof(**node));if (*node == NULL) exit(2);(*node)->value = -1;(*node)->next[0] = NULL;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MOD_BY 998244353
int add(int a, int b) {
return a + b - MOD_BY * (a + b >= MOD_BY);
}
struct node_s {
int value;
struct node_s *next[2];
};
int* getValuePtr(struct node_s** node, int key) {
if (*node == NULL) {
*node = malloc(sizeof(**node));
if (*node == NULL) exit(2);
(*node)->value = -1;
(*node)->next[0] = NULL;
(*node)->next[1] = NULL;
}
if (key == 0) {
return &(*node)->value;
} else {
return getValuePtr(&(*node)->next[key & 1], key >> 1);
}
}
int H, W;
char S[256][256];
int keyModBy;
char grid[256][256];
struct node_s* memo[256][16];
int calc(int y, int x, int key) {
if (y >= H) {
return 1;
} else {
int* memoPtr = getValuePtr(&memo[y][x], key);
int i, newKeyBase = key * 3 % keyModBy;
char orig = grid[y][x];
int ans = 0;
if (*memoPtr >= 0) return *memoPtr;
for (i = 0; i < 3; i++) {
grid[y][x] = '1' + i;
if (
(orig == '?' || grid[y][x] == orig) &&
(y == 0 || grid[y][x] != grid[y - 1][x]) &&
(x == 0 || grid[y][x] != grid[y][x - 1])
) {
ans = add(ans, calc(y + (x == W - 1), (x + 1) % W, newKeyBase + i));
}
}
grid[y][x] = orig;
return *memoPtr = ans;
}
}
int main(void) {
int i, j;
if (scanf("%d%d", &H, &W) != 2) return 1;
for (i = 0; i < H; i++) {
if (scanf("%255s", S[i]) != 1) return 1;
}
if (H < W) {
for (i = 0; i < H; i++) {
for (j = 0; j < W; j++) {
grid[j][i] = S[i][j];
}
}
i = H;
H = W;
W = i;
} else {
memcpy(grid, S, sizeof(S));
}
for (keyModBy = 1, i = 0; i < W; i++) keyModBy *= 3;
printf("%d\n", calc(0, 0, 0));
return 0;
}
/*
H×W <= 200 → HとWのどっちかは14以下
適宜転置し、大きくない方をWにする
上から下、左から右に順番に埋める
埋める場所の前W個を状態としてメモ
隣接するマスが異なる数字という制約があるので、最初と行が変わる所だけ制約が外れ、
(3**2)*(2**(W-2)) = 36864 通り
36864 * 200 = 7,372,800 これは十分小さい
3通りをそのままやると 3**14 = 4782969 通り
4782969 * 200 = 956,593,800 これはちょっと厳しいか
*/
Submission Info
| Submission Time | |
|---|---|
| Task | G - Count Grid 3-coloring |
| User | mikecat |
| Language | C (gcc 12.2.0) |
| Score | 0 |
| Code Size | 2267 Byte |
| Status | TLE |
| Exec Time | 3382 ms |
| Memory | 1074700 KB |
Judge Result
| Set Name | Sample | All | ||||||
|---|---|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 0 / 575 | ||||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
| All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt, 01_test_40.txt, 01_test_41.txt, 01_test_42.txt, 01_test_43.txt, 01_test_44.txt, 01_test_45.txt, 01_test_46.txt, 01_test_47.txt, 01_test_48.txt, 01_test_49.txt, 01_test_50.txt, 01_test_51.txt, 01_test_52.txt, 01_test_53.txt, 01_test_54.txt, 01_test_55.txt, 01_test_56.txt, 01_test_57.txt, 01_test_58.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 00_sample_00.txt | AC | 0 ms | 1816 KB |
| 00_sample_01.txt | AC | 0 ms | 1720 KB |
| 00_sample_02.txt | AC | 2 ms | 3372 KB |
| 01_test_00.txt | AC | 0 ms | 1712 KB |
| 01_test_01.txt | AC | 1 ms | 1656 KB |
| 01_test_02.txt | AC | 0 ms | 1860 KB |
| 01_test_03.txt | AC | 0 ms | 1744 KB |
| 01_test_04.txt | AC | 0 ms | 1736 KB |
| 01_test_05.txt | AC | 0 ms | 1784 KB |
| 01_test_06.txt | AC | 0 ms | 1716 KB |
| 01_test_07.txt | AC | 0 ms | 1660 KB |
| 01_test_08.txt | AC | 0 ms | 1924 KB |
| 01_test_09.txt | AC | 1 ms | 1916 KB |
| 01_test_10.txt | AC | 1 ms | 1920 KB |
| 01_test_11.txt | AC | 1 ms | 2248 KB |
| 01_test_12.txt | AC | 2 ms | 2796 KB |
| 01_test_13.txt | AC | 3 ms | 3800 KB |
| 01_test_14.txt | AC | 6 ms | 6120 KB |
| 01_test_15.txt | AC | 15 ms | 12536 KB |
| 01_test_16.txt | AC | 30 ms | 22868 KB |
| 01_test_17.txt | AC | 63 ms | 43932 KB |
| 01_test_18.txt | AC | 129 ms | 77404 KB |
| 01_test_19.txt | AC | 320 ms | 180364 KB |
| 01_test_20.txt | AC | 1028 ms | 430860 KB |
| 01_test_21.txt | AC | 1657 ms | 674376 KB |
| 01_test_22.txt | AC | 936 ms | 390500 KB |
| 01_test_23.txt | AC | 323 ms | 164888 KB |
| 01_test_24.txt | AC | 165 ms | 96188 KB |
| 01_test_25.txt | AC | 57 ms | 40776 KB |
| 01_test_26.txt | AC | 31 ms | 22448 KB |
| 01_test_27.txt | AC | 14 ms | 11860 KB |
| 01_test_28.txt | AC | 6 ms | 6120 KB |
| 01_test_29.txt | AC | 3 ms | 3708 KB |
| 01_test_30.txt | AC | 1 ms | 2552 KB |
| 01_test_31.txt | AC | 1 ms | 2184 KB |
| 01_test_32.txt | AC | 1 ms | 1792 KB |
| 01_test_33.txt | AC | 1 ms | 1696 KB |
| 01_test_34.txt | AC | 1 ms | 1804 KB |
| 01_test_35.txt | AC | 2206 ms | 710092 KB |
| 01_test_36.txt | AC | 1087 ms | 410680 KB |
| 01_test_37.txt | AC | 3 ms | 4764 KB |
| 01_test_38.txt | AC | 14 ms | 15016 KB |
| 01_test_39.txt | TLE | 3382 ms | 1074700 KB |
| 01_test_40.txt | AC | 2062 ms | 771400 KB |
| 01_test_41.txt | AC | 3 ms | 4724 KB |
| 01_test_42.txt | AC | 16 ms | 18344 KB |
| 01_test_43.txt | AC | 1900 ms | 709960 KB |
| 01_test_44.txt | AC | 690 ms | 337704 KB |
| 01_test_45.txt | AC | 3 ms | 4416 KB |
| 01_test_46.txt | AC | 8 ms | 9992 KB |
| 01_test_47.txt | AC | 1889 ms | 705372 KB |
| 01_test_48.txt | AC | 1865 ms | 705288 KB |
| 01_test_49.txt | AC | 1890 ms | 689844 KB |
| 01_test_50.txt | AC | 1851 ms | 681816 KB |
| 01_test_51.txt | AC | 1560 ms | 616188 KB |
| 01_test_52.txt | AC | 1697 ms | 619336 KB |
| 01_test_53.txt | AC | 33 ms | 27872 KB |
| 01_test_54.txt | AC | 52 ms | 38300 KB |
| 01_test_55.txt | AC | 1 ms | 1748 KB |
| 01_test_56.txt | AC | 1 ms | 1812 KB |
| 01_test_57.txt | AC | 0 ms | 1620 KB |
| 01_test_58.txt | AC | 0 ms | 1576 KB |