Submission #441878

#TimeUsernameProblemLanguageResultExecution timeMemory
441878rainboyLinear Garden (IOI08_linear_garden)C11
100 / 100
95 ms10044 KiB
/* discussed with Dukkha on dp/dq */
#include <stdio.h>

#define N	1000000

int main() {
	static int xx[N], yy[N], dp[3][3], dq[3][3];
	static char s[N + 1];
	int n, m, i, cnt, x, x_, y, y_;

	scanf("%d%d%s", &n, &m, s);
	for (i = 1; i < n; i++) {
		if (s[i - 1] == 'P') {
			xx[i] = xx[i - 1] + 1;
			yy[i] = yy[i - 1] - 1;
		} else {
			xx[i] = xx[i - 1] - 1;
			yy[i] = yy[i - 1] + 1;
		}
		if (xx[i] < 0)
			xx[i] = 0;
		if (yy[i] < 0)
			yy[i] = 0;
	}
	dp[0][0] = 1;
	cnt = 1;
	for (i = n - 1; i >= 0; i--) {
		if (s[i] == 'P') {
			x = xx[i] - 1;
			y = yy[i] + 1;
			if (x < 0)
				x = 0;
			for (x_ = 0; x + x_ < 3; x_++)
				for (y_ = 0; y + y_ < 3; y_++)
					cnt = (cnt + dp[x_][y_]) % m;
		}
		for (x = 0; x < 3; x++)
			for (y = 0; y < 3; y++) {
				/* P */
				x_ = x + 1;
				y_ = y - 1;
				if (y_ < 0)
					y_ = 0;
				if (x_ < 3)
					dq[x_][y_] = (dq[x_][y_] + dp[x][y]) % m;
				/* L */
				x_ = x - 1;
				y_ = y + 1;
				if (x_ < 0)
					x_ = 0;
				if (y_ < 3)
					dq[x_][y_] = (dq[x_][y_] + dp[x][y]) % m;
			}
		for (x = 0; x < 3; x++)
			for (y = 0; y < 3; y++) {
				dp[x][y] = dq[x][y];
				dq[x][y] = 0;
			}
	}
	printf("%d\n", cnt);
	return 0;
}

Compilation message (stderr)

linear_garden.c: In function 'main':
linear_garden.c:11:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   11 |  scanf("%d%d%s", &n, &m, s);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...