Submission #544609

#TimeUsernameProblemLanguageResultExecution timeMemory
544609rainboyVim (BOI13_vim)C11
100 / 100
41 ms22520 KiB
/* upsolve using analysis */
#include <stdio.h>
#include <string.h>

#define N	70000
#define A	10
#define INF	0x3f3f3f3f

int min(int a, int b) { return a < b ? a : b; }

int main() {
	static char cc[N + 1], must[N + 1];
	static int dp[N + 1][A], dq[N + 1][A][A];
	int n, n_, i, a, b, a_, b_, e, ans;

	scanf("%d%s", &n, cc), n = strlen(cc);
	n_ = 0, e = 1, ans = 0;
	for (i = 0; i < n; i++)
		if (cc[i] != 'e') {
			cc[n_] = cc[i], must[n_] = e, n_++;
			e = 0;
		} else {
			ans += n_ == 0 ? 1 : 2;
			e = 1;
		}
	cc[n_++] = 'e';
	n = n_;
	cc[n] = 0;
	for (i = 0; i < n; i++) {
		memset(dp[i], 0x3f, sizeof dp[i]);
		memset(dq[i], 0x3f, sizeof dq[i]);
	}
	dp[0][cc[0] - 'a'] = 0;
	for (i = 0; i + 1 < n; i++) {
		int c = cc[i] - 'a';

		for (a = 0; a < A; a++) {
			int x = dp[i][a];

			if (x == INF)
				continue;
			if (a != c) {
				if (!must[i])
					dp[i + 1][a] = min(dp[i + 1][a], x);
				for (b = 0; b < A; b++)
					dq[i + 1][a][b] = min(dq[i + 1][a][b], x + 3);
			} else
				for (a_ = 0; a_ < A; a_++) {
					dp[i + 1][a_] = min(dp[i + 1][a_], x + 2);
					for (b_ = 0; b_ < A; b_++)
						dq[i + 1][a_][b_] = min(dq[i + 1][a_][b_], x + 5);
				}
		}
		for (a = 0; a < A; a++)
			for (b = 0; b < A; b++) {
				int x = dq[i][a][b];

				if (x == INF)
					continue;
				if (a != c && b != c)
					dq[i + 1][a][b] = min(dq[i + 1][a][b], x + 1);
				else if (a != c && b == c)
					for (b_ = 0; b_ < A; b_++)
						dq[i + 1][a][b_] = min(dq[i + 1][a][b_], x + 3);
				else if (a == c && b != c) {
					dp[i + 1][b] = min(dp[i + 1][b], x);
					for (a_ = 0; a_ < A; a_++)
						dq[i + 1][a_][b] = min(dq[i + 1][a_][b], x + 3);
				} else
					for (b_ = 0; b_ < A; b_++) {
						dp[i + 1][b_] = min(dp[i + 1][b_], x + 2);
						for (a_ = 0; a_ < A; a_++)
							dq[i + 1][a_][b_] = min(dq[i + 1][a_][b_], x + 5);
					}
			}
	}
	ans += dp[n - 1][4] - 2;
	printf("%d\n", ans);
	return 0;
}

Compilation message (stderr)

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