Submission #60013646


Source Code Expand

Copy
#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;
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#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
AC × 3
AC × 61
TLE × 1
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


2024-12-04 (Wed)
07:32:35 +09:00