Submission #71073918


Source Code Expand

Copy
#include <stdio.h>
#define MOD_BY 1000000007
int add(int a, int b) {
return a + b - MOD_BY * (a + b >= MOD_BY);
}
int N;
char s[4096];
int memo[4096][4096];
#if 0
int calc(int pos, int available) {
int unavailable = N - pos - available;
int ans = 0;
int i;
if (pos >= N) return 1;
if (memo[pos][available]) return ~memo[pos][available];
for (i = 0; i < available; i++) {
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include <stdio.h>

#define MOD_BY 1000000007

int add(int a, int b) {
	return a + b - MOD_BY * (a + b >= MOD_BY);
}

int N;
char s[4096];

int memo[4096][4096];

#if 0
int calc(int pos, int available) {
	int unavailable = N - pos - available;
	int ans = 0;
	int i;
	if (pos >= N) return 1;
	if (memo[pos][available]) return ~memo[pos][available];
	for (i = 0; i < available; i++) {
		int next_available;
		if ((pos == 0 ? '<' : s[pos - 1]) == s[pos]) {
			/* 同じ方向 → 今の所より「上」のみを次に使える */
			next_available = available - i - 1;
		} else {
			/* 違う方向 → 今の所より「下」のみを次に使える */
			next_available = unavailable + i;
		}
		ans = add(ans, calc(pos + 1, next_available));
	}
	return ~(memo[pos][available] = ~ans);
}

int solve(void) {
	return calc(0, N);
}
#else
int sub(int a, int b) {
	return b == 0 ? a : add(a, MOD_BY - b);
}

int memo_sum[4096][4096];

int solve(void) {
	int pos, available;
	memo[N][0] = 1;
	memo_sum[N][0] = 1;
	for (pos = N - 1; pos >= 0; pos--) {
		for (available = 0; available <= N - pos; available++) {
			int start, end;
			if ((pos == 0 ? '<' : s[pos - 1]) == s[pos]) {
				start = 0; /* available - (available - 1) - 1 */
				end = available - 1;
			} else {
				start = N - pos - available;
				end = N - pos - 1; /* N - pos - available + (available - 1) */
			}
			if (start <= end) {
				int ans = memo_sum[pos + 1][end];
				if (start > 0) ans = sub(ans, memo_sum[pos + 1][start - 1]);
				memo[pos][available] = ans;
			}
			memo_sum[pos][available] = add(available > 0 ? memo_sum[pos][available - 1] : 0, memo[pos][available]);
		}
	}
	return memo[0][N];
}
#endif

int main(void) {
	if (scanf("%d", &N) != 1) return 1;
	if (scanf("%4095s", s) != 1) return 1;
	printf("%d\n", solve());
	return 0;
}

/*

ある整数を使う → そのあとはそれを除いた列で考えればいい (何を使ったかはあまり関係ない)

*/

Submission Info

Submission Time
Task T - Permutation
User mikecat
Language C (gcc 12.2.0)
Score 100
Code Size 2029 Byte
Status AC
Exec Time 42 ms
Memory 49400 KiB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 17
Set Name Test Cases
All 0_00, 0_01, 0_02, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13
Case Name Status Exec Time Memory
0_00 AC 1 ms 1620 KiB
0_01 AC 1 ms 1744 KiB
0_02 AC 1 ms 1764 KiB
1_00 AC 0 ms 1624 KiB
1_01 AC 1 ms 1692 KiB
1_02 AC 32 ms 49304 KiB
1_03 AC 31 ms 49400 KiB
1_04 AC 42 ms 49288 KiB
1_05 AC 42 ms 49372 KiB
1_06 AC 37 ms 49396 KiB
1_07 AC 36 ms 48480 KiB
1_08 AC 36 ms 48356 KiB
1_09 AC 37 ms 48644 KiB
1_10 AC 36 ms 48008 KiB
1_11 AC 36 ms 48176 KiB
1_12 AC 34 ms 46636 KiB
1_13 AC 37 ms 49152 KiB


2025-11-20 (Thu)
07:54:29 +09:00