Submission #17222478


Source Code Expand

#include <bits/stdc++.h>

typedef long long int64;

const int N = 3e2, MOD = 998244353;

int n, m, s, a[N + 5], f[N + 5][N + 5][N + 5], g[N + 5][N + 5][N + 5], h[N + 5][N + 5][N + 5];
char str[N + 5];

inline void add(int &x, const int &y) {
	(x += y) >= MOD && (x -= MOD);
}
inline void sub(int &x, const int &y) {
	(x -= y) < 0 && (x += MOD);
}
inline int add(const int &x) {
	return x >= MOD ? x - MOD : x;
}
inline int sub(const int &x) {
	return x < 0 ? x + MOD : x;
}
int main() {
	scanf("%s%d", str + 1, &s);
	n = strlen(str + 1);
	str[n + 1] = '0';
	int sum = 0;
	for (int cnt = 0, i = 1; i <= n + 1; i++) {
		if (str[i] == '0') {
			a[++m] = cnt;
			cnt = 0;
		} else {
			cnt++;
			sum++;
		}
	}
	s = std::min(s, sum - a[1]);
	f[0][0][0] = 1;
	std::fill(g[0][0], g[0][0] + n + 1, 1);
	std::fill(h[0][0], h[0][0] + n + 1, 1);
	for (int pre = 0, i = 1; i <= m; i++) {
		pre += a[i];
		for (int j = 0; j <= s; j++) {
			for (int k = 0; k <= j && k + pre <= sum; k++) {
				auto query = [](int *a, int l, int r) {
					return l == 0 ? a[r] : sub(a[r] - a[l - 1]);
				};
				// for (int p = 1; p <= k; p++) {
				// 	f[i][j][k] += f[i - 1][j - p][k - p];
				// }
				if (k > 0) {
					add(f[i][j][k], query(h[i - 1][j - k], 0, k - 1)); // k >= 1
				}
				// for (int p = 0; p <= a[i]; p++) {
				// 	f[i][j][k] += f[i - 1][j][k + p];
				// }
				add(f[i][j][k], query(g[i - 1][j], k, std::min(k + a[i], n)));
			}
			std::partial_sum(f[i][j], f[i][j] + n + 1, g[i][j], [](const int &x, const int &y) {
				return add(x + y);
			});
		}
		for (int j = 0; j <= s; j++) {
			for (int k = 0; k <= n; k++) {
				h[i][j][k] = add(h[i][j][k - 1] + (k + j <= n ? f[i][k + j][k] : 0));
			}
		}
	}
	int ans = 0;
	for (int i = 0; i <= s; i++) {
		add(ans, f[m][i][0]);
	}
	printf("%d\n", ans);
	return 0;
}

Submission Info

Submission Time
Task C - Shift
User siyuan
Language C++ (GCC 9.2.1)
Score 800
Code Size 1878 Byte
Status AC
Exec Time 93 ms
Memory 85228 KiB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:23:7: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   23 |  scanf("%s%d", str + 1, &s);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 3
AC × 39
Set Name Test Cases
Sample s1.txt, s2.txt, s3.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, s1.txt, s2.txt, s3.txt
Case Name Status Exec Time Memory
01.txt AC 70 ms 56456 KiB
02.txt AC 56 ms 49780 KiB
03.txt AC 87 ms 83976 KiB
04.txt AC 30 ms 13136 KiB
05.txt AC 58 ms 45516 KiB
06.txt AC 31 ms 14876 KiB
07.txt AC 71 ms 63968 KiB
08.txt AC 75 ms 68180 KiB
09.txt AC 37 ms 8032 KiB
10.txt AC 1 ms 3644 KiB
11.txt AC 93 ms 85228 KiB
12.txt AC 76 ms 67356 KiB
13.txt AC 88 ms 82580 KiB
14.txt AC 35 ms 27920 KiB
15.txt AC 53 ms 46496 KiB
16.txt AC 41 ms 29796 KiB
17.txt AC 36 ms 8936 KiB
18.txt AC 75 ms 67464 KiB
19.txt AC 11 ms 8232 KiB
20.txt AC 9 ms 6332 KiB
21.txt AC 11 ms 6644 KiB
22.txt AC 9 ms 7104 KiB
23.txt AC 45 ms 22116 KiB
24.txt AC 42 ms 16492 KiB
25.txt AC 5 ms 5332 KiB
26.txt AC 5 ms 4728 KiB
27.txt AC 48 ms 33480 KiB
28.txt AC 20 ms 5732 KiB
29.txt AC 2 ms 3796 KiB
30.txt AC 3 ms 3636 KiB
31.txt AC 2 ms 3824 KiB
32.txt AC 2 ms 3712 KiB
33.txt AC 3 ms 4004 KiB
34.txt AC 3 ms 5804 KiB
35.txt AC 13 ms 9464 KiB
36.txt AC 2 ms 3764 KiB
s1.txt AC 2 ms 3612 KiB
s2.txt AC 2 ms 3668 KiB
s3.txt AC 6 ms 6036 KiB